我正在为子进程编写进程外转储。这是相关的代码片段:
CONTEXT thread_context{};
thread_context.ContextFlags = CONTEXT_FULL;
assert(GetThreadContext(child_thread_handle, &thread_context));
EXCEPTION_POINTERS exception_ptrs;
exception_ptrs.ExceptionRecord = &exception_info.ExceptionRecord;
exception_ptrs.ContextRecord = &thread_context;
MINIDUMP_EXCEPTION_INFORMATION minidump_exception_info;
minidump_exception_info.ThreadId = evt.dwThreadId;
minidump_exception_info.ExceptionPointers = &exception_ptrs;
minidump_exception_info.ClientPointers = FALSE;
auto success = MiniDumpWriteDump(child_handle, evt.dwProcessId, file_handle, minidump_flags, &minidump_exception_info, nullptr, nullptr);
这给了我异常信息,以及每个引发异常的线程之外的每个线程的调用堆栈。如果我将
&minidump_exception_info
更改为nullptr,则会得到调用堆栈,但没有异常信息。有没有办法同时获取异常信息和调用堆栈? 最佳答案
使用CONTEXT_FULL调用GetThreadContext不会捕获获取堆栈跟踪所需的所有寄存器,并且上下文的存在会阻止调试器使用其他信息来获取调用堆栈。而是使用CONTEXT_ALL获得足够的信息来重新创建调用堆栈。
https://msdn.microsoft.com/en-us/magazine/hh580738.aspx是解决此问题的有用引用。