VS2015在DebuggerStepTrough中抛出异常?

时间:2015-12-04 07:08:01

标签: visual-studio debugging visual-studio-2015

我刚刚升级了我的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”)

1 个答案:

答案 0 :(得分:5)

您是对的,您描述的行为是Visual Studio 2015中引入的新performance improvement的结果。新功能大大降低了处理非用户模块中抛出和捕获的clr异常的调试开销(启用“仅我的代码”)。

不幸的是,在疏忽中,抛出异常并在[DebuggerHidden],[DebuggerNonUserCode]和/或[DebuggerStepThrough]属性中捕获的异常不再被视为抛出并捕获到非用户代码中 - 调试器实际上忽略了Visual Studio 2015中与异常有关的那些属性(步骤过滤和调用堆栈过滤仍然与它们在Visual Studio 2013中的工作方式相同)。

坏消息是没有好方法可以恢复此方案的先前版本的行为。有两种可能的选择:

  1. 将您的应用程序定位为使用.net框架版本< 4.0
  2. 重构您的代码,使具有这些调试器属性的函数/类位于不同的模块中,并构建该模块已优化和/或没有符号。
  3. 好消息是Visual Studio调试器团队已经确认了该问题,并将在Visual Studio 2015的下一次更新中提供解决方法。

    <强>更新

    Visual Studio 2015 Update 2中提供了此问题的解决方法,详细信息请参见Using the DebuggerNonUserCode Attribute in Visual Studio 2015博客文章。

    对于那些只想知道该怎么做的人。在命令提示符中运行以下命令:

    reg add HKCU\Software\Microsoft\VisualStudio\14.0_Config\Debugger\Engine /v AlwaysEnableExceptionCallbacksOutsideMyCode /t REG_DWORD /d 1