我刚刚升级了我的VS2013,相同的代码在调试模式下有不同的行为.
在VS2013中,我得到了调试中断我得到的异常.
其中一些可能发生并被处理的部分放在带有DebuggerStepTrough的Try-catch块中:
例:
[DebuggerStepThrough] private void DoSomething(){ try{ throw new InvalidOperationException();//Obviously in my case, it's not a throw exception here but a method }catch(InvalidOperationException){ //log something & handling this case } } private void SomeEntryPoint(){ DoSomething();//In VS2015 I got the debug breaking here. In VS2013 I don't }
我在VS2013中没有这种行为.有没有办法避免它?
(我启用了"Just My Code")
您是对的,您描述的行为是Visual Studio 2015中引入的新性能改进的结果.新功能大大降低了处理在非用户模块中抛出和捕获的clr异常的调试开销(启用了Just My Code) ).
不幸的是,在一个疏忽中,抛出异常并在[DebuggerHidden],[DebuggerNonUserCode]和/或[DebuggerStepThrough]属性中捕获的异常不再被视为抛出并被非用户代码捕获 - 调试器基本上忽略了那些Visual Studio 2015中与异常有关的属性(步骤过滤和调用堆栈过滤仍然与Visual Studio 2013中的相同).
坏消息是没有好方法可以恢复此方案的先前版本的行为.有两种可能的选择:
将您的应用程序定位为使用.net框架版本<4.0
重构您的代码,使具有这些调试器属性的函数/类位于不同的模块中,并构建该模块已优化和/或没有符号.
好消息是Visual Studio调试器团队已经确认了该问题,并将在Visual Studio 2015的下一次更新中提供解决方法.
更新
Visual Studio 2015 Update 2中提供了此问题的解决方法,详细信息请参阅Visual Studio 2015博客文章中的使用DebuggerNonUserCode属性.
对于那些只想知道该怎么做的人.在命令提示符中运行以下命令:
reg add HKCU\Software\Microsoft\VisualStudio\14.0_Config\Debugger\Engine /v AlwaysEnableExceptionCallbacksOutsideMyCode /t REG_DWORD /d 1