我的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错误.
有任何想法吗?
地铁.
当我读到关于在"Exception ..."对话框中有两个复选框的答案时,我回去再次打开对话框.我只有一列复选框 - 用于"投掷"中断.
事实证明,如果您在"调试"选项中未选中"仅启用我的代码(仅管理)",则"用户未处理"列不会显示在"例外"对话框中.
我选择了"启用我的代码"选项,并确认已为所有例外类别选择了"例外"对话框中的"用户未处理"复选框.
我能够获得未处理的异常以进入一个会话的调试器.但是当我第二天回来时,行为和以前一样.
地铁.
如果您使用的是64位操作系统,则很可能会被操作系统级别的行为所困扰,导致异常消失.重现它的最可靠的方法是创建一个新的WinForm应用程序,它只是在OnLoad中抛出一个异常; 它似乎不会被抛出.看看这些:
Visual Studio不会破坏Windows 64位的未处理异常
http:// social.msdn.microsoft.com/Forums/en/vsdebug/thread/69a0b831-7782-4bd9-b910-25c85f18bceb
消失的OnLoad异常的情况
x64开发机器上的无提示异常(Microsoft Connect)
https:// connect.microsoft.com/VisualStudio/feedback/details/357311/silent-exceptions-on-x64-development-machines
第一个是我从谷歌发现的(在此线程没有帮助之后),那个线程引导我进入以下两个.第二个是最好的解释,第三个是Microsoft bug/ticket(重新确认这是"按设计"行为).
所以,基本上,如果你的应用程序抛出一个在返回堆栈的路上遇到内核模式边界的异常,它会在该边界被阻塞.Windows团队决定处理它的最好方法是假装异常被处理; 执行继续,好像一切都正常完成.
哦,这到处都是.调试与发布无关..Net与C++无关.这是操作系统级别的行为.
想象一下,你必须将一些关键数据写入磁盘,但它在内核模式边界的错误一侧失败.其他代码稍后会尝试使用它,如果你很幸运,你会发现数据有问题......但为什么呢?我打赌你永远不会认为你的应用程序无法写入数据---因为你预计会抛出异常.
抽搐.