【问题标题】:How do I debug exceptions in unknown code?如何调试未知代码中的异常?
【发布时间】:2012-08-17 01:02:24
【问题描述】:

我有一个使用外部库的程序。其中一个库(负责相机硬件)启动一个线程并意外崩溃。有时每两分钟一次,有时不是一个小时。没有明显的诱因。线程没有捕获到异常,这会导致应用程序终止。 :(

幸运的是,当kernel32.dll 中的RaiseException() 函数引发异常时,我可以停止应用程序。调用堆栈上没有其他我知道它们的用途的函数。

调试器告诉我,这是一个 std::bad_alloc 异常。调试器是怎么知道的?我能以某种方式获得有关异常的更多信息吗?如有必要,我会查看反汇编,但我不知道从哪里获取信息。

我使用的是 Visual Studio C++ 2010,对汇编程序非常熟悉,并且对 WINAPI 有一定的了解。我们希望尽快发布这个软件,这个错误必须消失。

【问题讨论】:

    标签: c++ debugging exception assembly


    【解决方案1】:

    改用 Windbg,这是一个核心调试器,它什么都不隐藏,而是“按原样”公开事物。使用sxe 语法启用所需的异常(Windgb 将启用在任何 SEH 类型处中断,而不仅仅是 C++)。 Windbg 对第一次机会异常和第二次机会异常也有明确的区分。然后您应该弄清楚这是引发的 C++ 异常还是更基本的 SEH 类型(可能是 AV)。

    【讨论】:

    • 这是一个 C++ 异常,因为它是 std::bad_alloc,因此它不是 SEH 异常。例外是第一次机会。是否有任何异常参数或类似的东西,我可以读出?如果有,怎么做?
    • 请注意,所有 C++ 异常都是 SEH 异常(代码 e06d7363)。有关如何从 SEH EXCEPTION_RECORD 获取 C++ type_info 的讨论,请参阅 drdobbs.com/visual-c-exception-handling-instrumentat/184416600codeproject.com/Articles/2126/…。从技术上讲,您没有遇到第一次机会异常,而是处于 RaiseException 的断点(即异常尚未引发)。
    • 哇!感谢这些真棒参考。也许您应该将它们直接添加到您的帖子中。明天我会仔细查看您的链接。
    • @RalphTandetzky 确保您正在调查的第一次机会异常实际上会导致第二次机会异常,因为在第二次机会发生之前可能有数千个第一次机会异常。
    猜你喜欢
    • 2014-01-08
    • 1970-01-01
    • 2021-10-28
    • 2017-05-20
    • 2015-12-04
    • 1970-01-01
    • 1970-01-01
    • 2018-09-06
    • 2017-09-25
    相关资源
    最近更新 更多