如何在未知代码中调试异常?

Ral*_*zky 5 c++ debugging assembly exception

我有一个使用外部库的程序.其中一个库(负责相机硬件)启动一个线程并且无法预测崩溃.有时每2分钟,有时不会持续一个小时.没有明显的触发因素.线程没有捕获异常,导致应用程序终止.:(

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

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

我正在使用Visual Studio C++ 2010,熟悉汇编程序并对WINAPI有所了解.我们想尽快发布这个软件,这个bug必须消失.

Rem*_*anu 4

请改用 Windbg,这是一个硬核调试器,不会隐藏任何内容并“按原样”公开内容。使用sxe语法启用所需的异常(Windgb 将启用在任何 SEH 类型处中断,而不仅仅是 C++)。Windbg 还对第一次机会异常和第二次机会异常进行了明确区分。然后您应该弄清楚这是引发的 C++ 异常还是更基本的 SEH 类型(例如 AV)。

  • 请注意,所有 C++ 异常都是 SEH 异常(代码 e06d7363)。请参阅 http://www.drdobbs.com/visual-c-exception-handling-instrumentat/184416600 或 http://www.codeproject.com/Articles/2126/How-aC-compiler-implements-exception-handling 了解讨论如何从 SEH EXCEPTION_RECORD 获取 C++ `type_info`。从技术上讲,您没有遇到第一次机会异常,而是处于 RaiseException 中的断点(即,尚未引发异常)。 (3认同)