2

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

有任何想法吗?

地铁。

4

6 回答 6

6

当我阅读有关在“例外...”对话框中有两个复选框的答案时,我返回并再次打开该对话框。我只有一列复选框——用于“抛出”的中断。

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

我选择了“仅启用我的代码”选项并验证了“异常”对话框上的“用户未处理”复选框已为所有异常类别选中。

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

地铁。

于 2008-09-19T16:17:06.580 回答
5

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

  1. Visual Studio 不会因 Windows 64 位的未处理异常而中断
    • http://social.msdn.microsoft.com/Forums/en/vsdebug/thread/69a0b831-7782-4bd9-b910-25c85f18bceb
  2. OnLoad异常消失的案例
  3. x64 开发机器上的静默异常 (Microsoft Connect)
    • https://connect.microsoft.com/VisualStudio/feedback/details/357311/silent-exceptions-on-x64-development-machines

第一个是我从谷歌找到的(在这个线程没有帮助之后),那个线程把我带到了以下两个。第二个有最好的解释,第三个是 Microsoft 错误/票证(再次确认这是“设计”行为)。

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

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

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

混蛋。

于 2010-12-04T17:13:00.887 回答
2

Ctl-D, E 调出例外窗口。您可以设置您想要和不想要的例外情况。

于 2008-09-19T15:42:55.227 回答
0

“异常...”框中有两个复选框,我通常必须检查它们以使其在未处理的异常上中断。不管它读起来像你需要检查一个。

于 2008-09-19T15:42:51.967 回答
0

每隔一段时间,这也发生在我身上。这似乎是一个错误或其他东西,因为当我复制场景时,异常被捕获并像往常一样显示。

于 2008-09-19T15:51:34.177 回答
0

我有一个类似的问题,检查“仅启用我的代码(仅限托管)”解决了这个问题,而如果我把它关掉然后问题又回来了,不知道为什么(但有可能一些 DLL 似乎得到了未选中时加载会导致该行为)。

于 2012-07-24T20:03:46.933 回答