C++ 检测C+中的进程崩溃+/Win32

C++ 检测C+中的进程崩溃+/Win32,c++,windows,winapi,process,win32-process,C++,Windows,Winapi,Process,Win32 Process,我正在开发一个包含两个程序的软件:Qt主exe+OpenGL游戏exe 我们总是首先使用Qt主exe。当我们点击“开始游戏”按钮时,我们执行OpenGL游戏exe。这样做没有问题 问题是,有时我们在OpenGL游戏exe中发生崩溃,我们希望将包含日志的崩溃报告发送到我们的compagny崩溃报告邮件 我在Win32 API中找到一个函数(registerwaitforsingleobject),但我不知道进程是否崩溃: 我只想使用win32 api(WinXP WinVist到Win10) 提

我正在开发一个包含两个程序的软件:Qt主exe+OpenGL游戏exe

我们总是首先使用Qt主exe。当我们点击“开始游戏”按钮时,我们执行OpenGL游戏exe。这样做没有问题

问题是,有时我们在OpenGL游戏exe中发生崩溃,我们希望将包含日志的崩溃报告发送到我们的compagny崩溃报告邮件

我在Win32 API中找到一个函数(registerwaitforsingleobject),但我不知道进程是否崩溃:

我只想使用win32 api(WinXP WinVist到Win10)


提前感谢

使用现成的解决方案,如CrashRpt。它将安装一个适当的处理程序,并在抛出异常时报告/提交您需要的内容

您可以使用

以时间圈(例如,1秒)发送消息。如果没有响应,您几乎可以肯定另一个程序已崩溃


另一种不那么优雅的方法是测试日志文件,每x秒修改一次,其值表示“我还活着,没有崩溃”。

假设您关心的程序有一个正常的Windows事件循环,检查它是否以合理及时的方式处理消息的标准方法是使用发送消息

程序不会响应
WM_NULL
,但如果消息在其消息队列中停留的时间过长(您在调用时选择“过长”的含义),则
SendMessageTimeout
将超时。所以你发送它,然后检查它是否超时


但请注意:这仅适用于处理Windows消息的程序。如果没有消息循环,它将始终超时。哦,一个程序是多线程的,一个线程可以“崩溃”(例如,进入无限循环),而其他线程可以继续正常运行,因此定义“崩溃”的含义并不总是那么容易。

我找到了问题的解决方案:我使用了Win32 API()中的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;
}

但他正在尝试处理崩溃(未处理的异常,例如:访问冲突)或无响应的应用程序?这可能是相关的,也可能不是。。。他说“OpenGL Exe崩溃”,我怀疑这是一个未经处理的异常,这就是为什么我推荐一个自动工具来安装一个处理程序并或多或少轻松地进行“崩溃报告”。@Hernán:正如我所说,“定义‘崩溃’的意思并不总是那么容易。”但是,如果它有Windows事件循环,“无响应”主要是指“不处理消息”,这是要检查的。无论原因是未捕获的异常、无限循环,还是只是在UI线程中进行长时间的处理(或其他任何原因),这都是正确的。您通常从提供的回调调用并生成崩溃报告。设置为在未处理的异常上生成转储文件。在
RegisterWaitForSingleObject
处理程序中,检查新的转储文件,并使用适合您需要的技术将其发送到服务器。
int main()
{
   int * ptr = nullptr;
   *ptr = 123;
   return 0;
}