【问题标题】:Stack information disappears when I add exception information to my minidump当我将异常信息添加到我的小型转储时,堆栈信息消失了
【发布时间】:2015-06-29 15:51:21
【问题描述】:

我正在为子进程编写进程外小型转储。下面是相关代码sn-p:

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,我会得到调用堆栈但没有异常信息。有没有办法同时获取异常信息和调用堆栈?

【问题讨论】:

  • 这是一个非常错误的 assert() 调用。您根本不应该这样做,EXCEPTION_POINTERS 需要由崩溃过程生成。阅读this post 获取提示。

标签: c++ windows minidump


【解决方案1】:

使用 CONTEXT_FULL 调用 GetThreadContext 不会捕获获取堆栈跟踪所需的所有寄存器,并且上下文的存在会阻止调试器使用其他信息来获取调用堆栈。使用 CONTEXT_ALL 可以获得足够的信息来重新创建调用堆栈。

https://msdn.microsoft.com/en-us/magazine/hh580738.aspx 是解决此问题的有用参考。

【讨论】:

    猜你喜欢
    • 2012-04-13
    • 2021-04-18
    • 1970-01-01
    • 1970-01-01
    • 2011-08-29
    • 1970-01-01
    • 1970-01-01
    • 2015-04-22
    • 1970-01-01
    相关资源
    最近更新 更多