当前位置:  开发笔记 > 编程语言 > 正文

VS2015在DebuggerStepTrough中抛出异常?

如何解决《VS2015在DebuggerStepTrough中抛出异常?》经验,为你挑选了1个好方法。

我刚刚升级了我的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> John..:

您是对的,您描述的行为是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

推荐阅读
帆侮听我悄悄说星星
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有