【问题标题】:how to get callstack in a released application when use _set_purecall_handler使用 _set_purecall_handler 时如何在已发布的应用程序中获取调用堆栈
【发布时间】:2013-01-25 03:13:07
【问题描述】:

我的代码有时会运行到“纯函数调用”错误,所以我使用 _set_purecall_handler 来注册处理程序。在调试模式下,我可以使用 StackWalker 获得完整的调用堆栈,但在发布模式下,StackWalker 显示的有用信息很少。我尝试使用 MiniDumpWriteDump 并设置 ExceptionPointers = NULL。崩溃后,我得到了一个转储文件,但 vs 无法调试它并显示: 找不到指定的模板。请检查完整路径是否正确。
在这种情况下是否可以从已发布的应用程序中获取信息?

【问题讨论】:

  • 你可以随时提供调试信息
  • @Cheersandhth.-Alf 我也想得到一些调试信息。有一些石灰做纯函数调用,我想在崩溃时从调用堆栈中找到位置。
  • 如果默认的 _purecall_handler 显示一个消息框,那么不要调用 _set_purecall_handler。相反,在显示错误消息时将 windbg 附加到进程,配置符号,然后发出~*kb windbg 命令以获取所有线程的调用堆栈。然后查看每个调用堆栈,直到看到一个调用 MessageBox 的某个变体。

标签: c++ c windows windbg


【解决方案1】:

通常,我们可以通过匹配子类的vtable和抽象类的vtable来猜测调用的方法——抽象类的vtable有一堆pure_call处理程序,用于没有实现的虚函数。

您需要了解的有关方法调用的所有信息都在堆栈和寄存器中 - 只需查看调用站点的反汇编,注意用于从 vtable 检索函数的偏移量,转储已故对象的实际 vtable -您可以通过反汇编寻找`vftable'的构造函数的代码来查找它。然后,使用 dds 进行简单检查应该会提供您需要知道调用哪个方法的所有信息(但不知道为什么对象消失了:o)

【讨论】:

  • 这个应用程序在其他机器上运行,所以当它崩溃时我无法获取它的堆栈和寄存器,它只是弹出一个错误对话框,没有任何有用的信息,只有 r6025..
  • 这太糟糕了——我建议通过谷歌 breakpad 之类的东西或crash-server 之类的服务添加某种未处理的异常处理
猜你喜欢
  • 1970-01-01
  • 2012-05-12
  • 2013-01-20
  • 2011-06-26
  • 2020-12-04
  • 1970-01-01
  • 2017-01-13
  • 2014-11-14
  • 2015-06-18
相关资源
最近更新 更多