[英]Detecting a process crash in C++/Win32
我正在开发一个包含2个程序的软件:Qt Main exe + OpenGL Game exe
首先,我们始终使用Qt Main exe。 当我们点击“开始游戏”按钮时,我们执行OpenGL Game exe。 这样做没有问题。
问题是,有时我们在OpenGL Game exe中发生崩溃,我们希望将包含日志的崩溃报告发送到我们的崩溃报告邮件中。
我在Win32 API中找到了一个函数(registerwaitforsingleobject),但我不知道该进程是否崩溃: https : //docs.microsoft.com/zh-cn/windows/desktop/api/winbase/nf-winbase- registerwaitforsingleobject
我只想使用win32 api(从WinXP-WinVist到Win10)
提前致谢
使用现成的解决方案,例如CrashRpt http://crashrpt.sourceforge.net/ 。 当抛出异常时,它将安装适当的处理程序并报告/提交所需的内容。
假设您关心的程序具有正常的Windows事件循环, WM_NULL
某种合理的及时方式检查它是否正在处理消息的标准方法是使用SendMessageTimeout
向其发送WM_NULL
消息。
该程序不会响应WM_NULL
,但是如果消息在其消息队列中停留的时间过长(在调用时您选择“太长”的含义), SendMessageTimeout
将超时。 因此,您发送它,然后检查它是否超时。
但是请注意:这仅适用于处理Windows消息的程序。 如果没有消息循环,它将始终超时。 哦,一个程序是多线程的,一个线程可能“崩溃”(例如进入无限循环),而其他线程继续正常运行,因此定义“崩溃”的含义并不总是那么容易。
我找到了解决问题的方法:我使用了Win32 API( https://docs.microsoft.com/zh-cn/windows/desktop/api/processthreadsapi/nf-processthreadsapi-getexitcodeprocess )中的GetExitCodeProcess函数。
这是示例代码:
int main(int argc, char** arv)
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
const char * prgm = "CrashedProcess.exe";
LPSTR prgmLpstr = const_cast<LPSTR>(prgm);
// Start the child process.
if (!CreateProcess(NULL, // No module name (use command line)
prgmLpstr, // Command line
NULL, // Process handle not inheritable
NULL, // Thread handle not inheritable
FALSE, // Set handle inheritance to FALSE
0, // No creation flags
NULL, // Use parent's environment block
NULL, // Use parent's starting directory
&si, // Pointer to STARTUPINFO structure
&pi) // Pointer to PROCESS_INFORMATION structure
)
{
printf("CreateProcess failed (%d).\n", GetLastError());
return -1;
}
// Wait until child process exits.
auto ret = WaitForSingleObject(pi.hProcess, INFINITE);
printf("WaitForSingleObject ret = %x\n", ret);
if (ret == WAIT_OBJECT_0)
{
printf("WaitForSingleObject ret ret == WAIT_OBJECT_0\n");
}
BOOL b = FALSE;
DWORD n = 0;
b = GetExitCodeProcess(pi.hProcess, &n);
if (n == 0xC0000005)
{
printf("Process Crashed !!!\n");
}
// Close process and thread handles.
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
printf("WaitForSingleObject end\n");
return 0;
}
CrashedProcess.exe源代码:
int main()
{
int * ptr = nullptr;
*ptr = 123;
return 0;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.