|
发表于 2025-7-10 13:26:36
|
显示全部楼层
山西省太原市
#include <windows.h>
#include <tlhelp32.h>
#include <stdio.h>
#include <psapi.h>
// 检测进程是否存在
BOOL IsProcessRunning(DWORD pid) {
HANDLE hProcess = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, pid);
if (hProcess == NULL) {
return FALSE;
}
DWORD exitCode;
GetExitCodeProcess(hProcess, &exitCode);
CloseHandle(hProcess);
return (exitCode == STILL_ACTIVE);
}
// 检测进程是否无响应(假死)
BOOL IsProcessHung(DWORD pid) {
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pid);
if (hProcess == NULL) {
return FALSE;
}
DWORD exitCode;
if (!GetExitCodeProcess(hProcess, &exitCode)) {
CloseHandle(hProcess);
return TRUE; // 无法获取状态,可能挂起
}
CloseHandle(hProcess);
return (exitCode != STILL_ACTIVE); // 非活动状态视为异常
}
// 检测CPU占用率是否异常(卡死)
BOOL IsProcessHighCPU(DWORD pid, DWORD threshold) {
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pid);
if (hProcess == NULL) {
return FALSE;
}
FILETIME createTime, exitTime, kernelTime, userTime;
GetProcessTimes(hProcess, &createTime, &exitTime, &kernelTime, &userTime);
ULARGE_INTEGER kernelUL = { kernelTime.dwLowDateTime, kernelTime.dwHighDateTime };
ULARGE_INTEGER userUL = { userTime.dwLowDateTime, userTime.dwHighDateTime };
ULONGLONG totalTime = kernelUL.QuadPart + userUL.QuadPart;
Sleep(1000); // 等待1秒后再次采样
FILETIME newKernelTime, newUserTime;
GetProcessTimes(hProcess, &createTime, &exitTime, &newKernelTime, &newUserTime);
ULARGE_INTEGER newKernelUL = { newKernelTime.dwLowDateTime, newKernelTime.dwHighDateTime };
ULARGE_INTEGER newUserUL = { newUserTime.dwLowDateTime, newUserTime.dwHighDateTime };
ULONGLONG newTotalTime = newKernelUL.QuadPart + newUserUL.QuadPart;
CloseHandle(hProcess);
// 计算CPU占用率(单位:百分比)
ULONGLONG delta = newTotalTime - totalTime;
DWORD cpuUsage = (DWORD)(delta / 10000); // 转换为百分比近似值
return (cpuUsage >= threshold);
}
// 检测内存泄漏或异常占用
BOOL IsProcessMemoryLeak(DWORD pid, SIZE_T thresholdMB) {
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pid);
if (hProcess == NULL) {
return FALSE;
}
PROCESS_MEMORY_COUNTERS_EX pmc;
if (!GetProcessMemoryInfo(hProcess, (PROCESS_MEMORY_COUNTERS*)&pmc, sizeof(pmc))) {
CloseHandle(hProcess);
return FALSE;
}
CloseHandle(hProcess);
// 检查内存占用是否超过阈值(MB)
SIZE_T memoryUsageMB = pmc.WorkingSetSize / (1024 * 1024);
return (memoryUsageMB >= thresholdMB);
}
// 主函数:综合检测进程状态
void CheckProcessStatus(DWORD pid) {
if (!IsProcessRunning(pid)) {
printf("进程 %d 不存在或已退出\n", pid);
return;
}
if (IsProcessHung(pid)) {
printf("进程 %d 无响应(假死)\n", pid);
} else if (IsProcessHighCPU(pid, 90)) { // 阈值设为90%
printf("进程 %d CPU占用过高(可能卡死)\n", pid);
} else if (IsProcessMemoryLeak(pid, 500)) { // 阈值设为500MB
printf("进程 %d 内存占用异常(可能泄漏)\n", pid);
} else {
printf("进程 %d 运行正常\n", pid);
}
}
// 示例:监控notepad.exe
int main() {
DWORD pid = 1234; // 替换为目标进程PID
CheckProcessStatus(pid);
return 0;
}
补充内容 (2025-7-10 13:27):
你搞成DLL 易调用就行了 |
|