避免在 c# 中对一段代码进行调试和调用堆栈
Posted
技术标签:
【中文标题】避免在 c# 中对一段代码进行调试和调用堆栈【英文标题】:Avoid debug and callstack for a piece of code in c# 【发布时间】:2011-01-17 16:49:04 【问题描述】:在 Delphi 中,编译器指令 $d- 和 $l- 允许您有效地避免为已定义的代码段生成调试和局部变量信息。
实际上,在调试视图中具有“隐藏”代码效果的实际问题中,它不会出现在调用堆栈中,并且您在调试时也不会进入它。
有没有什么方法可以在 c# 中使用 VS 2008 实现相同的结果?
注意:原因是我们有一个稳定的框架,不需要调试,但往往会弄乱调用堆栈和标准调试流程。
【问题讨论】:
【参考方案1】:我使用DebuggerNonUserCodeAttribute,这样您就不会默认中断或进入代码;但是,与 DebuggerStepThrough 相比,这样做的好处是您可以转到 Options->Debugger->Just My Code 设置并允许破坏/调试您标记的代码。如果您遇到问题,这将有很大帮助。我通常在整个课程中使用它。
顺便说一句,调用堆栈将自动隐藏标有此属性的非用户代码 :) 当然,您可以简单地右键单击调用堆栈窗口并切换“显示外部代码”来隐藏/显示丢失的堆栈信息。
【讨论】:
我正要这么说。打败我。 好的,这似乎两者都有,但我要到明天才能检查它,所以我会访问答案:)【参考方案2】:我想你想要DebuggerStepThrough
属性:
DebuggerStepThrough
指示调试器单步执行代码,而不是单步执行代码。
[DebuggerStepThrough]
public void MyMethod()
这对 setter/getter 尤其有用,因为调试这些通常只会增加噪音(来自 msdn 的示例):
public int Quantity
[DebuggerStepThrough]
get return ComplexLogicConvertedToMethod();
[DebuggerStepThrough]
set this.quantity = value ;
【讨论】:
酷,非常有用。不知道这个。 很酷,但是这样可以去掉调用栈条目吗??【参考方案3】:或者跳过代码的特定部分:
... some production code
#if DEBUG
Console.WriteLine("Debug version");
#endif
... some more production code
【讨论】:
以上是关于避免在 c# 中对一段代码进行调试和调用堆栈的主要内容,如果未能解决你的问题,请参考以下文章
Jetbrains Rider:在调试器调用堆栈中显示“外部代码”