当使用 MiniDumpWriteDump 函数在 Windows 上创建进程的核心转储时,建议(例如 here 和 here )从另一个“看门狗”运行 MiniDumpWriteDump
进程,因为在同一进程中调用时它可能无法正常工作。
目前,我们的应用程序正在在遇到未处理的异常时在进程内调用它(我们从看门狗线程执行此操作)。由于我们有时会遇到无法正常工作的问题,因此我们希望将其移到一个单独的进程中。
现在,向其他进程发出信号以开始写入转储是微不足道的(只需使用一个事件、信号量,随便你怎么说)但是我如何传递我为回调函数获得的 LPEXCEPTION_POINTERS
信息使用 SetUnhandledExceptionFilter
注册到其他进程,以便它可以传递给 MiniDumpWriteDump
的 ExceptionParam
参数??
最佳答案
您还需要 MINIDUMP_EXCEPTION_INFORMATION.ThreadId 值。最简单的方法,也是我让它工作的方法,是使用内存映射文件来传输 ThreadId 和 ExceptionPointers。以及唤醒看门狗的命名事件。指针在看门狗进程的上下文中无效并不重要。
在监视进程中使用 CreateFileMapping + MapViewOfFile 作为其初始化的一部分,在看门狗中使用 OpenFileMapping + MapViewOfFile。然后,您的 SetUnhandledExceptionFilter 应该只调用 GetCurrentThreadId() 并将 tid 和 pExcept 复制到内存映射文件 View ,调用 SetEvent() 唤醒看门狗并永远阻塞,直到看门狗终止它。
关于c++ - 进程外使用MiniDumpWriteDump时如何获取异常信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13590980/