8

当使用 MiniDumpWriteDump 函数在 Windows 上创建进程的核心转储时,建议(例如herehereMiniDumpWriteDump从另一个“看门狗”进程运行,因为从同一进程中调用它可能无法正常工作。

目前,我们的应用程序在一个未处理的异常调用它(我们从一个看门狗线程执行它)。由于我们有时会遇到无法正常工作的问题,因此我们希望将其移至单独的进程。

现在,通知另一个进程开始写入转储是微不足道的(只需使用一个事件,信号量,你可以命名它)但是我如何将LPEXCEPTION_POINTERS我为我注册的回调函数获得的信息传递SetUnhandledExceptionFilter给另一个进程,以便它可以传递给MiniDumpWriteDumpsExceptionParam参数?

4

1 回答 1

7

您还需要 MINIDUMP_EXCEPTION_INFORMATION.ThreadId 值。最简单的方法,也是我让它工作的方法,是使用内存映射文件来传输 ThreadId 和 ExceptionPointers。以及一个唤醒看门狗的命名事件。指针在看门狗进程的上下文中无效并不重要。

在被监视的进程中使用 CreateFileMapping + MapViewOfFile 作为其初始化的一部分,在看门狗中使用 OpenFileMapping + MapViewOfFile。然后,您的 SetUnhandledExceptionFilter 应该只调用 GetCurrentThreadId() 并将 tid 和 pExcept 复制到内存映射文件视图,调用 SetEvent() 唤醒看门狗并永远阻塞,直到看门狗终止它。

于 2012-11-27T19:50:03.470 回答