当调用堆栈中存在某种方法时,点击一个断点

时间:2012-10-02 11:31:03

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

我希望在调用堆栈中存在某种方法时触发断点。 我可以使用Visual Studio调试器以某种方式执行此操作吗?

我想确保在从某些方法调用代码时会触发我的断点,而不是其他方法。

例如,我们有两个调用堆栈:

DBReadRecord()
GetRecord()
ActivityMonitor()

DBReadRecord()
GetRecord()
UserButtonDown()

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

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

2 个答案:

答案 0 :(得分:2)

你也可以做一些基于反射的黑客攻击(例如,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中,但是在启用优化时可能会发生这种情况。

答案 1 :(得分:1)

使用Visual Studio

转到VS中的“断点”窗口,然后单击左上角的“新建”按钮。

选择'Break at Function ...'然后在'Function'字段中输入您要破解的方法的全名(减去其括号)。

E.g。要打破.NET的Application.Run方法,请输入System.Windows.Forms.Application.Run

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

使用调试器命令

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