VS2008调试器不会在未处理的异常中断

时间:2008-09-19 15:41:14

标签: visual-studio-2008 debugging unhandled

我的vs调试器有一个奇怪的问题。在vs调试器下运行我的程序时,调试器不会中断未处理的异常。而是将控制权返回给VS,就像程序正常退出一样。如果我查看输出选项卡,就会在线程终止之前列出第一次机会。

我了解如何使用“调试”菜单中的“例外”框。我检查了未处理的异常。如果我检查正在发生的特定执行的第一次机会异常,调试器将停止。

但是,我的理解是调试器也应该停止任何'Unhandled-Exceptions'。它不是为我做的。

以下是“输出”标签的最后几行:

A first chance exception of type 'System.ArgumentOutOfRangeException' occurred in mscorlib.dll
The thread 0x60c has exited with code 0 (0x0).
The program '[3588] ALMSSecurityManager.vshost.exe: Managed' has exited with code -532459699 (0xe0434f4d).

我不明白为什么异常会在未处理时被标记为“第一次机会”异常。

我认为0xe0434f4d退出代码是一般的COM错误。

任何想法?

地铁。

6 个答案:

答案 0 :(得分:6)

当我读到关于在“Exception ...”对话框中有两个复选框的答案时,我回去再次打开对话框。我只有一列复选框 - 用于“Thrown”中断。

事实证明,如果您在“调试”选项中未选中“仅启用我的代码(仅管理)”,则“用户未处理”列不会显示在“例外”对话框中。

我选择了“启用我的代码”选项,并确认已为所有例外类别选择了“例外”对话框中的“用户未处理”复选框。

我能够获得未处理的异常以进入一个会话的调试器。但是当我第二天回来时,行为和以前一样。

地铁。

答案 1 :(得分:5)

如果您使用的是64位操作系统,那么您很可能会被操作系统级别的行为所困扰,导致异常消失。重现它的最可靠的方法是创建一个新的WinForm应用程序,它只是在OnLoad中抛出一个异常;它似乎不会被抛出。看看这些:

  1. Visual Studio不会破坏Windows 64位的未处理异常
    • http:// social.msdn.microsoft.com/Forums/en/vsdebug/thread/69a0b831-7782-4bd9-b910-25c85f18bceb
  2. The case of the disappearing OnLoad exception
  3. x64开发计算机上的无提示异常(Microsoft Connect)
    • https:// connect.microsoft.com/VisualStudio/feedback/details/357311/silent-exceptions-on-x64-development-machines
  4. 第一个是我从谷歌发现的(在此线程没有帮助之后),并且该线程引导我进入以下两个。第二个是最好的解释,第三个是Microsoft bug / ticket(重新确认这是“按设计”行为)。

    所以,基本上,如果你的应用程序抛出一个异常,它在返回堆栈的路上遇到内核模式边界,它会在该边界被阻塞。 Windows团队决定处理它的最佳方法是假装处理异常;执行继续,好像一切都正常完成。

    哦,这发生无处不在。调试与发布无关。 .Net与C ++无关。这是操作系统级别的行为。

    想象一下,您必须将一些关键数据写入磁盘,但它在内核模式边界的错误一侧失败。其他代码稍后会尝试使用它,如果你很幸运,你会发现数据有问题......但为什么呢?我打赌你永远不会认为你的应用程序无法写入数据 - 因为你预计会抛出异常。

    抽搐。

答案 2 :(得分:2)

Ctl-D,E打开Exceptions窗口。您可以设置您想要的但不想要的例外情况。

答案 3 :(得分:0)

“异常...”框中有两个复选框,我通常必须检查它们以使其在未处理的异常中中断。无论它只是阅读,你需要检查一个。

答案 4 :(得分:0)

每次这种情况发生在我身上。这似乎是一个bug或者其他东西,因为当我复制场景时,异常被捕获并像往常一样显示。

答案 5 :(得分:0)

我有类似的问题,并检查"启用我的代码(仅管理)"修复了问题,如果我把它关闭然后问题又回来了,不知道为什么(但是有些DLL在未经检查时似乎被加载会导致行为)。