我的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错误。
任何想法?
地铁。
答案 0 :(得分:6)
当我读到关于在“Exception ...”对话框中有两个复选框的答案时,我回去再次打开对话框。我只有一列复选框 - 用于“Thrown”中断。
事实证明,如果您在“调试”选项中未选中“仅启用我的代码(仅管理)”,则“用户未处理”列不会显示在“例外”对话框中。
我选择了“启用我的代码”选项,并确认已为所有例外类别选择了“例外”对话框中的“用户未处理”复选框。
我能够获得未处理的异常以进入一个会话的调试器。但是当我第二天回来时,行为和以前一样。
地铁。
答案 1 :(得分:5)
如果您使用的是64位操作系统,那么您很可能会被操作系统级别的行为所困扰,导致异常消失。重现它的最可靠的方法是创建一个新的WinForm应用程序,它只是在OnLoad中抛出一个异常;它似乎不会被抛出。看看这些:
第一个是我从谷歌发现的(在此线程没有帮助之后),并且该线程引导我进入以下两个。第二个是最好的解释,第三个是Microsoft bug / ticket(重新确认这是“按设计”行为)。
所以,基本上,如果你的应用程序抛出一个异常,它在返回堆栈的路上遇到内核模式边界,它会在该边界被阻塞。 Windows团队决定处理它的最佳方法是假装处理异常;执行继续,好像一切都正常完成。
哦,这发生无处不在。调试与发布无关。 .Net与C ++无关。这是操作系统级别的行为。
想象一下,您必须将一些关键数据写入磁盘,但它在内核模式边界的错误一侧失败。其他代码稍后会尝试使用它,如果你很幸运,你会发现数据有问题......但为什么呢?我打赌你永远不会认为你的应用程序无法写入数据 - 因为你预计会抛出异常。
抽搐。
答案 2 :(得分:2)
Ctl-D,E打开Exceptions窗口。您可以设置您想要的但不想要的例外情况。
答案 3 :(得分:0)
“异常...”框中有两个复选框,我通常必须检查它们以使其在未处理的异常中中断。无论它只是阅读,你需要检查一个。
答案 4 :(得分:0)
每次这种情况发生在我身上。这似乎是一个bug或者其他东西,因为当我复制场景时,异常被捕获并像往常一样显示。
答案 5 :(得分:0)
我有类似的问题,并检查"启用我的代码(仅管理)"修复了问题,如果我把它关闭然后问题又回来了,不知道为什么(但是有些DLL在未经检查时似乎被加载会导致行为)。