【问题标题】:C++ Win32 Unhandled Exception HandlerC++ Win32 未处理的异常处理程序
【发布时间】:2011-01-29 18:24:44
【问题描述】:

目前我使用SetUnhandledExceptionFilter() 提供回调以在发生未处理的异常时获取信息,该回调将为我提供EXCEPTION_RECORD,它提供ExceptionAddress

[1]ExceptionAddress 实际上是什么?是给出异常的函数/代码的地址,还是某个函数试图访问的内存地址?

[2]当发生未处理的异常时,是否有更好的机制可以为我提供更好的信息? (我不能使用调试模式或添加任何影响运行时性能的代码,因为崩溃很少见,并且只有在代码尽可能快地运行时才会在发布版本中)

[3]当发生未处理的异常时,有什么方法可以让我获得多个调用堆栈地址。

[4]假设ExceptionAddress 的地址为A,并且我在基址A-x 加载并执行了DLL X,在A+y 加载并执行了其他一些DLL Y,那么假设崩溃是很好的可能是由 DLL X 上的代码引起的?

【问题讨论】:

    标签: c++ exception dll crash callback


    【解决方案1】:

    (1) ExceptionAddress 是导致异常的代码的地址。在访问冲突错误 (0xC0000005) 的情况下,异常记录的附加参数之一保存尝试读取或写入的地址,另一个参数告诉它是读取还是写入。这记录在您在问题中提供的链接中。

    (2) 没有。此外,将调试信息添加到发布版本不会影响性能。您可以验证这一点并亲自查看。

    (3) dbghelp.dll 提供了一个完整的库来调查崩溃。其中有StackWalk64,它可以让你获得完整的崩溃堆栈。

    (4) 使用ExceptionAddress 作为参数调用GetModuleHandleEx 将为您获取违规代码所在的dll 的句柄。至于哪个 DLLCAUSED 崩溃的问题,这取决于您对“CAUSED”的定义。一个 dll 中发生的崩溃可能是完全不同且不相关的 dll 中的错误的结果。

    【讨论】:

    • (1)OK (2) 在我的情况下,如果我调试有关发布版本的信息,则永远不会发生崩溃。 (3)谢谢,请举一些例子如何使用? (4) 我会试试这个。谢谢
    • 这是一个基本教程,似乎展示了如何使用它,由谷歌提供:jpassing.com/2008/03/12/walking-the-stack-of-the-current-thread
    【解决方案2】:

    不是直接回答您的问题,但可能这是您需要的: http://www.codeproject.com/KB/debug/postmortemdebug_standalone1.aspx

    事后调试是当程序在客户端计算机上以 Release 版本运行时查找异常位置的方法。

    【讨论】:

    • 是的,我也用过,但是在 dev 端读取 minidump 很费时间,我需要快速猜测异常是如何/在哪里发生的。
    【解决方案3】:

    另外,不是直接回答您的问题,但我认为它可以帮助您:

    http://www.codeproject.com/KB/applications/blackbox.aspx

    它会产生一个可读的输出到屏幕或文件,这会给你一个堆栈输出来找到异常发生的地方以及其他有用的信息。

    对我来说效果很好。

    还有一个改进版本,名为“Blackbox modified”。不过现在找不到该网站。

    【讨论】:

      猜你喜欢
      • 2012-04-23
      • 2011-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多