1

就像在即时调试中一样,VS 2003 编译的应用程序是否在 catch (...) 中捕获 Win32(或异步)异常并展开堆栈?在写入转储文件之前...

4

2 回答 2

1

不,调试器调用是在从异常向上运行堆栈的代码中创建的,因此堆栈尚未展开。对于同步(C++)和异步(OS)异常都是如此。

请参见著名的 MSJ 文章A Crash Course on the Depths of Win32™ 结构化异常处理中的图 13

如果没有过滤器承认愿意处理异常,则在第一次通过异常过滤器列表后调用未处理的异常过滤器。第一次通过在展开之前,在第二次通过时发生。如果您在有机会时闯入调试器,您会发现异常位于堆栈中,这很有意义:调试已经展开的堆栈几乎没有价值,您将不知道发生了什么错误的。

于 2010-02-25T06:42:48.513 回答
0

这取决于在编译应用程序时选择的堆栈展开语义可以指示编译器捕获或不捕获代码的 SEH 异常。启动代码总是捕获 C++ 和 SEH 异常,如果捕获到任何异常,它将终止应用程序。

于 2010-02-25T06:44:16.090 回答