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

时间:2020-03-06 14:26:36  来源:igfitidea点击:

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

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

但是,据我了解,调试器也应在出现任何"未处理的异常"时停止。它不是为我做的。

这是"输出"选项卡的最后几行:

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错误。

有任何想法吗?

地铁。

解决方案

"例外..."框中有两个复选框,通常我都必须选中它们,以使其在未处理的例外情况下中断。不管它读起来像是需要检查一下。

Ctl-D,E弹出"例外"窗口。我们可以设置想要但不想中断的异常。

每隔一段时间,我也会发生这种情况。似乎是一个错误或者类似的东西,因为当我复制该场景时,异常被捕获并像往常一样显示。

当我阅读有关在"异常..."对话框中具有两个复选框的答案时,我返回并再次打开该对话框。我只有一列复选框-用于"抛出"中断。

事实证明,如果我们在"调试"选项中未选中"仅启用我的代码(仅受管理)",则"异常"对话框中不会显示"用户未处理"列。

我选择了"启用我的代码"选项,并验证是否为所有异常类别选中了"异常"对话框上的"用户未处理"复选框。

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

地铁。

如果我们使用的是64位操作系统,则很有可能被操作系统级别的行为所困扰,该行为会导致异常消失。重现它的最可靠方法是制作一个新的WinForm应用程序,该应用程序仅在OnLoad中引发异常。它似乎不会被抛出。看看这些:

  • OnLoad异常消失的情况

第一个是我从Google找到的(此线程无济于事),然后该线程将我引向了以下两个。第二个是最好的解释,第三个是Microsoft错误/票证(再次确认这是"设计使然"行为)。

因此,基本上,如果应用程序在返回堆栈的途中抛出一个异常,该异常在内核模式边界上到达,则它将在该边界处被阻塞。 Windows团队决定最好的处理方法是假装处理异常。执行将继续,就好像一切正​​常完成一样。

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

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

混蛋