避免在 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# 中对一段代码进行调试和调用堆栈的主要内容,如果未能解决你的问题,请参考以下文章

调试与异常

GDB调试汇编堆栈过程分析

Jetbrains Rider:在调试器调用堆栈中显示“外部代码”

如何避免在 TensorFlow 中添加重复的集合?

vs2005调试的时候老是弹出来“没有可用于当前位置可用的源代码”,这个问题怎么解决??

如何中断从 c# interop 调用的 c++ 代码