【问题标题】:Visual Studio 2015 debugger stops for a handled exception of a DebuggerHidden functionVisual Studio 2015 调试器因 DebuggerHidden 函数的已处理异常而停止
【发布时间】:2017-01-31 18:24:07
【问题描述】:

我希望调试器在以下情况下停止:

  • 发生已处理或未处理的异常。
  • 在具有 DebuggerStepThrough 或 DebuggerHidden 属性的函数中发生未处理的异常。调试器应在调用此函数的位置停止。

到目前为止没有问题,我可以让 Visual Studio 2015 像这样工作。但是,当具有 DebuggerStepThroughDebuggerHidden 属性的函数内部发生 handled 异常时,调试器会在调用该函数的位置停止。 p>

我找不到解决此问题的方法。我不记得 Visual Studio 2010 或 2013 上的这种行为。我已经搜索过它,但没有发现有人问同样的问题。

编辑: 我试过DebuggerNonUserCode,结果是一样的。它说“抛出异常”。不,不是的!

我的设置:

【问题讨论】:

  • 您要求调试器停止“第一次机会”异常。不错的功能,对于调试不应该吞下异常的代码非常重要。您可以简单地取消选中对话框中的“抛出此异常类型时中断”复选框。但您更有可能想要重置 Debug > Windows > Exception Settings。如果您想利用该属性,请重新打开“工具”>“选项”>“调试”>“常规”>“仅启用我的代码”。
  • 我想你误会了。我已经尝试过这些,但无法解决我的问题。我确实希望调试器因异常而中断。但不希望它因 DebuggerHidden 函数中处理的异常而中断。
  • 嗯,不,我很确定我完全明白你的意思。为什么你不想恢复我描述的设置很难猜到。照原样,您似乎还没有意识到您不小心更改了它们。如果您有意更改了它们,那么说明您这样做的原因很重要。
  • @Koray MSDN 文章实际上证明了你不是在想象事情,它也不是一个错误。解释和解决方法是最后一段。它是由调试性能特性引起的。也许您应该寻找最小化异常而不是忽略它们的方法?如果它们如此频繁以至于破坏会伤害您,它也会伤害运行时性能

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


【解决方案1】:

您可以在 VS2015 中使用 DebuggerNonUserCode 属性而不是 DebuggerStepThrough 或 DebuggerHidden 属性,因为它们之间存在一些小的差异:

https://blogs.msdn.microsoft.com/visualstudioalm/2016/02/12/using-the-debuggernonusercode-attribute-in-visual-studio-2015/

更新:

我在使用 VS2015 时遇到了与您相同的问题。我发现它与调试选项有关,请在工具->选项->调试下启用“使用托管兼容模式”选项。再次调试。

【讨论】:

  • 虽然这在理论上可以回答问题,it would be preferable 在此处包含答案的基本部分,并提供链接以供参考。事实上,这篇文章包含一个重要的警告,NOT 在这个答案中描述
  • 在 VS2013 DebuggerStepThough 属性用来做我想做的事。如果我没记错的话。
  • @Koray,请启用“使用托管兼容模式”选项,再次调试:)
  • 托管兼容模式有一个缺点:调试时无法编辑和继续:(
【解决方案2】:

MSDN 文章 Using the DebuggerNonUserCode Attribute in Visual Studio 2015 解释了 DebuggerNonUserCode 的作用为什么它不忽略异常。

这是由 VS 2015 中的性能改进引起的

启用“仅我的代码”后,调试器将不再收到在“您的代码”之外引发和处理的异常的通知。

这会带来很大的性能提升,因为:

调试性能得到改善,因为启用“仅我的代码”后,调试器不再收到在“您的代码”之外引发和处理的异常的通知。

可以通过更新 2 引入的注册表项关闭此行为:

要启用此功能,请从命令行运行以下命令,该命令将为您调整注册表:

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

您必须进行试验,看看什么更重要,忽略异常或更好的调试器性能。

【讨论】:

  • @Koray 也考虑投掷。如果异常如此频繁以至于它们伤害了您,它们也会损害运行时性能。返回结果对象(强制调用者检查是否成功)是函数式语言中使用的一种解决方案。例如,这就是 HttpClient 的工作原理
  • @Panagiotis Kanavos,感谢您的帮助,它提供了更详细和有用的信息:)
  • 其实我不会写依赖于抛出异常的代码。感谢您的精彩回答和评论。
  • 很抱歉,但这并没有解决问题。我认为这是解决方案。我在尝试之前忘记检查异常设置,并认为这是有效的。对此非常抱歉。
猜你喜欢
  • 1970-01-01
  • 2011-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多