【发布时间】:2012-03-01 08:43:49
【问题描述】:
我的 C++ 程序抛出程序中未处理的异常,因此在调试模式下 VS 会处理它,显示一个有关发生未处理异常的事实的窗口。但是我可以查看这个未处理的异常吗?它是什么类型,被抛出的对象内部是什么?
【问题讨论】:
标签: c++ visual-studio-2010 debugging exception
我的 C++ 程序抛出程序中未处理的异常,因此在调试模式下 VS 会处理它,显示一个有关发生未处理异常的事实的窗口。但是我可以查看这个未处理的异常吗?它是什么类型,被抛出的对象内部是什么?
【问题讨论】:
标签: c++ visual-studio-2010 debugging exception
您可以尝试点击 Break 并踏入。如果有任何代码需要分析,那么 VS 将进入异常类的处理程序或构造函数。无论如何,这就是我在VS2010中所做的。
从那时起,如果您知道异常对象的地址,那么您应该能够将其粘贴到 Watch 窗口并转换为基本异常类(如果异常不是系统异常并且您有一个很好的类层次结构)。
附: 您可以拥有自己的未处理异常例程来在其中设置断点。可以这么简单:
// global scope
LONG WINAPI my_unh_exc_hndlr(_EXCEPTION_POINTERS* excPtrs)
{
return EXCEPTION_CONTINUE_SEARCH; // Put a breakpoint here in IDE.
}
// ... somewhere in the beginning of main()
SetUnhandledExceptionFilter(my_unh_exc_hndlr);
应该在每次遇到未处理的异常时运行。
另一个程序随机崩溃?没有可用的来源?没问题。注入代码(小 DLL),在那里为您设置处理程序例程(除非您的权限较低)并进行调试。
【讨论】:
在大多数情况下,当异常发生时,Visual Studio 应该会弹出一个对话框,其中包含中断程序的选项,使您能够查看它在代码中发生的位置。此外,您应该能够在异常发生之前分析对象、指针等的值。这应该足以了解发生了什么问题(除非您正在处理堆损坏或类似的讨厌的事情)。如果不知道异常本身的细节,很难说更多。
【讨论】:
如果您看不到异常的所有信息,您可能需要检查 Visual Studio 中的调试设置。转到 Debug 菜单并单击 Exceptions... 从那里您可以选择中断所有异常。这应该会强制调试器在异常发生时尽快中断。
【讨论】: