0

当调用堆栈中有某个方法时,我想要一个断点。我可以用 Visual Studio 调试器以某种方式做到这一点吗?

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

例如我们有两个调用栈:

DBReadRecord()
GetRecord()
ActivityMonitor()

DBReadRecord()
GetRecord()
UserButtonDown()

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

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

4

2 回答 2

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 中的方法中可能会发生什么优化,但是当优化打开时可能会发生这种情况。

于 2012-10-02T11:57:09.023 回答
1

使用 Visual Studio

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

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

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

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

使用调试器命令

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

于 2012-10-02T11:46:22.583 回答