2

我正在尝试添加在程序崩溃时捕获小型转储的功能。根据我的阅读,这最好通过使用另一个用于托管真实应用程序并执行转储的应用程序(看门狗)来实现。

通过查看诸如此类的帖子我想出了以下内容(App 和 WatchDog 都是使用 Win32 在 C++ 中实现的):

  • 当看门狗启动时,它会创建 2 个事件,一个ExitedOk事件和一个Exception事件,这两个事件都设置为可继承且不发出信号。它还创建一个可继承的文件映射。

  • 然后看门狗启动“真正的应用程序”,并在WaitOnMultipleObjects中等待ExitedOkException发出信号。

  • 当应用程序启动时,它会创建相同的 2 个事件(它将继承句柄)

  • 该应用程序配置为,如果它退出正常,它会发出ExitedOk信号,或者如果发生未处理的异常,它会使用继承的文件映射存储异常/线程信息,发出Exception信号,然后休眠(无限)。

  • 如果看门狗中的 WaitOnMultipleObjects 用ExitedOk发出信号,则什么也不会发生。如果使用Exception发出信号,则它使用文件映射读取异常/线程信息,然后调用 MiniDumpWriteDump。

显然 Sleep() 是一个问题。这最好通过另一个事件解决吗?这样应用程序会等到看门狗发出一些“FinishedCreatingDump”事件的信号吗?

其次,我认为看门狗的全部意义在于你没有在可能不稳定的崩溃过程中做任何工作?如果我正确理解了工作流程,并且您确实需要在实际崩溃的过程中使用 SetEvent/OpenFileMapping/MapViewOfFile,那么这不就像从中调用 MiniDumpWriteDump 一样糟糕吗?

4

0 回答 0