2008-09-19 88 views
2

我的vs调试器有一个奇怪的问题。当在vs调试器下运行我的程序时,调试器不会中断未处理的异常。相反,控制返回到VS,就像程序正常退出一样。如果我查看输出选项卡,那么在线程终止之前会列出第一次执行的任务。VS2008调试器在未处理的异常时没有中断

我知道如何使用“例外”框中,从调试菜单。我有检查未处理的异常中断。如果我检查发生特定的exeption的第一次机会异常,调试器将停止。

但是,我的理解是,调试器也应该停止在任何“未处理 - 例外”。这不是为我做的。

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

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). 

我不明白为什么例外是flagges为“第一次机会”异常时,它是未经处理的。

我相信0xe0434f4d退出代码是一个通用的COM错误。

什么想法?

地铁。

回答

5

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

  1. 的Visual Studio不会对未处理的异常的窗户打破64位
    • 的http:// social.msdn.microsoft。COM /论坛/ EN/vsdebug /线程/ 69a0b831-7782-4bd9-b910-25c85f18bceb
  2. The case of the disappearing OnLoad exception
  3. 寂静异常在x64开发机器(Microsoft连接)
    • 的https://连接。 microsoft.com/VisualStudio/feedback/details/357311/silent-exceptions-on-x64-development-machines

第一个是我从谷歌(发现这个THR后ead没有帮助),而这个线索让我接下来两个。第二个是最好的解释,第三个是Microsoft bug/ticket(重申了这是“按设计”行为)。因此,基本上,如果您的应用程序在返回堆栈时抛出一个遇到内核模式边界的异常,它将在该边界处被阻塞。 Windows团队决定处理这个问题的最佳方式是假装处理异常;继续执行,就好像一切正​​常完成。

噢,发生这种情况无处不在。调试与发布无关。 .Net vs C++是无关紧要的。这是操作系统级别的行为。

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

垃圾。

+0

我保证,它没有没有恶意!可选方案是让您的机器额外运行,超级缓慢(不断保存完整的寄存器上下文),或者在用户模式回调中发生SEH异常时立即启动应用程序。好消息是,用户模式回调在窗口过程中是完全(*)的,所以这不会影响服务应用程序,也不会影响工作线程(即任何非窗口线程) – 2011-01-14 08:24:58

0

有两个复选框“例外...”中,我平时也有他们两个检查让它对未处理的异常中断。不管它只读,就像你需要检查一样。

2

Ctl-D,E调出异常窗口。你可以设置你想要的例外,并且不想打破。

0

每当我发生这种情况时也会发生。这看起来像一个错误或什么的,因为当我复制的情况下,例外被捕获并显示如常。

6

当我阅读关于在“例外...”对话框中有两个复选框的答案时,我回去并再次打开对话框。我只有一列复选框 - 打破“投掷”。

事实证明,如果你没有“启用仅我的代码(仅限托管)”中的调试选项选中,“用户未处理”一栏没有出现在“例外”对话框中显示。

我选择了“启用我的代码”选项,并验证所有异常类别都选中了“例外”对话框中的“用户未处理”复选框。

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

地铁。

+0

看到我的帖子,它可能与“启用只是我的代码”设置本身有关,因此有可能在后面的会话中这个设置有所恢复 – 2012-07-24 20:05:13

0

我有类似的问题,并检查“启用只是我的代码(只管理)”修复了这个问题,而如果我把它关闭然后问题回来了,不知道为什么(但有可能是一些DLL的当它未被选中时,看起来会被加载导致行为)。