【问题标题】:Hit a breakpoint when there is certain method in call stack当调用堆栈中存在某个方法时命中断点
【发布时间】:2012-10-02 11:31:03
【问题描述】:

我希望在调用堆栈中有某个方法时触发断点。 我可以用 Visual Studio 调试器以某种方式做到这一点吗?

我想确保当从某些方法调用代码时,我的断点会被命中,而不是其他方法。

例如我们有两个调用栈:

DBReadRecord()
GetRecord()
ActivityMonitor()

DBReadRecord()
GetRecord()
UserButtonDown()

我希望DBReadRecord 中的断点仅在从UserButtonDown() 方法调用而不是从ActivityMonitor() 方法调用时被命中。

我正在使用 Visual Studio 10 和 .Net 3.5。

【问题讨论】:

  • 是自己源码中的方法还是第三方库中的方法?

标签: .net debugging breakpoints visual-studio-debugging


【解决方案1】:

您还可以进行一些基于反射的黑客攻击(例如,Express 版本似乎没有高级断点功能):

    void Foo()
    {
        Foo2();
    }
    void Foo2()
    {
        var trace = new StackTrace();
        if (trace.GetFrames().Reverse().FirstOrDefault(f => f.GetMethod().Name == "Foo") != null)
            Debugger.Break(); // it lives under System.Diagnostics namespace
    }
    void Test()
    {
        Foo2(); // doesn't break here
        Foo(); // break here
    }

并使用您的特定方法:

Foo DBReadRecord()
{
     var trace = new StackTrace();
     if (trace.GetFrames().Reverse().FirstOrDefault(f => f.GetMethod().Name == "UserButtonDown") != null)
         Debugger.Break();
}

请注意,它会极大地影响性能,因此它只是针对奇怪调试情况的临时解决方案。

另外,请记住,它在 Debug 配置中效果最好,我不知道在不在 StackTrace 中的方法中可能会发生什么优化,但是当优化打开时可能会发生这种情况。

【讨论】:

【解决方案2】:

使用 Visual Studio

进入 VS 的断点窗口,点击左上角的“新建”按钮。

选择“Break at Function...”,然后在“Function”字段中输入要在其中中断的方法的全名(减去括号)。

例如要中断 .NET 的 Application.Run 方法,请输入 System.Windows.Forms.Application.Run

可能有警告显示 Intellisense 找不到指定位置。这意味着当断点被命中时您可能无法看到源代码,但这对于您的目的可能仍然足够有用。

使用调试器命令

如果您有权访问并可以编译源代码,您还可以在代码运行时使用System.Diagnostics.Debugger.Launch() 命令以编程方式附加到调试器,或者如果您已经附加了Debugger.Break()

【讨论】:

  • 我不想中断方法。只有当某些方法在调用堆栈中(深)时,我才需要中断。
  • 好的,我看到了你编辑的问题。在这种情况下,您可以使用@Bartosz 的解决方案来检查调用堆栈,然后使用 Debugger.Break() 添加断点。
  • 确实,Debugger.Break() 似乎比我的“无操作”行更好,这些行除了充当普通 VS 断点的占位符之外什么都不做:)
猜你喜欢
  • 2016-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-18
  • 1970-01-01
  • 2012-03-14
相关资源
最近更新 更多