【问题标题】:Conditional Breakpoints on Call Stack调用堆栈上的条件断点
【发布时间】:2011-04-04 15:06:27
【问题描述】:

是否可以在 Visual Studio 2010 中指定一个断点,该断点只有在调用堆栈上的调用方法满足某些特定条件时才会触发?例如,很可能是方法名称。

理想情况下,我希望在 Visual Studio 本身中寻找一个解决方案,例如条件断点,但我会满足于在代码中测试堆栈中的方法名称并具有编码断点。

我想要实现的是切断来自特定呼叫者的呼叫。

【问题讨论】:

    标签: c# visual-studio-2010 debugging conditional-breakpoint


    【解决方案1】:

    右键单击断点,选择“条件”并使用如下内容:

    new System.Diagnostics.StackTrace().ToString().Contains("YourMethodName")
    

    【讨论】:

    • 这会将整个堆栈跟踪串起来,使其非常贪婪。是否可以迭代最后 5 个调用者并测试他们的名字,同时仍将代码插入“条件...”sn-p?
    • 由于条件必须是单行,所以可以将GetFrame(index)||结合使用,但效果会更差。
    • 我从未暗示存在性能问题。我强调了这样一个事实,即在其上调用 ToString 会将整个堆栈帧粘贴到一个字符串中,因此我无法控制说明我只对直接调用者或第 5 个调用者感兴趣。因此我说它是贪婪的,例如,检查整个堆栈框架,而不仅仅是我感兴趣的部分。
    • 我会将您的答案标记为有关条件断点的更多信息的答案,但是因为我需要很好地控制堆栈的状态,所以我必须在代码中物理实现它。我将尝试制作一个静态助手,它为我提供了一个可以放入条件断点的单行代码:-)
    • @Adam BTW,如果您只对直接调用者感兴趣,请将“new System.Diagnostics.Stack Trace ()”替换为“new System.Diagnostics.Stack 框架 ()”。如果您对第 5 个调用者感兴趣,请将其替换为“new System.Diagnostics.Stack Frame(4)
    【解决方案2】:

    StackTrace class 应该可以满足您的需求。

    StackTrace stackTrace = new StackTrace();           
    StackFrame[] stackFrames = stackTrace.GetFrames(); 
    

    【讨论】:

      猜你喜欢
      • 2020-05-03
      • 2013-02-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-31
      • 1970-01-01
      • 2017-03-14
      • 1970-01-01
      • 2011-01-18
      相关资源
      最近更新 更多