.net 当调用堆栈中存在某个方法时命中断点

.net 当调用堆栈中存在某个方法时命中断点,.net,debugging,breakpoints,visual-studio-debugging,.net,Debugging,Breakpoints,Visual Studio Debugging,我希望在调用堆栈中有某个方法时命中断点。 我可以通过VisualStudio调试器以某种方式执行此操作吗 我希望确保当从某些方法调用代码时,会命中断点,而不是从其他方法调用代码 例如,我们有两个调用堆栈: DBReadRecord() GetRecord() ActivityMonitor() 及 我希望仅当从UserButtonDown()方法调用DBReadRecord中的断点时,而不是从ActivityMonitor()方法调用该断点时,才会命中该断点 我正在使用Visual Studi

我希望在调用堆栈中有某个方法时命中断点。 我可以通过VisualStudio调试器以某种方式执行此操作吗

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

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

DBReadRecord()
GetRecord()
ActivityMonitor()

我希望仅当从
UserButtonDown()
方法调用
DBReadRecord
中的断点时,而不是从
ActivityMonitor()
方法调用该断点时,才会命中该断点


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

使用Visual Studio

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

选择“在函数处中断…”,然后在“函数”字段中输入要中断的方法的全名(减去括号)

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

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

使用调试器命令


如果您可以访问并编译源代码,也可以在代码运行时使用命令以编程方式附加到调试器,或者如果您已经附加到调试器上。

使用Visual Studio

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

选择“在函数处中断…”,然后在“函数”字段中输入要中断的方法的全名(减去括号)

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

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

使用调试器命令


如果您可以访问并编译源代码,也可以在代码运行时使用命令以编程方式附加到调试器,或者如果您已经附加了调试器。

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

用你的特殊方法:

Foo DBReadRecord()
{
     var trace = new StackTrace();
     if (trace.GetFrames().Reverse().FirstOrDefault(f => f.GetMethod().Name == "UserButtonDown") != null)
         Debugger.Break();
}
请注意,它会极大地影响性能,因此对于奇怪的调试情况,它只是临时解决方案


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

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

用你的特殊方法:

Foo DBReadRecord()
{
     var trace = new StackTrace();
     if (trace.GetFrames().Reverse().FirstOrDefault(f => f.GetMethod().Name == "UserButtonDown") != null)
         Debugger.Break();
}
请注意,它会极大地影响性能,因此对于奇怪的调试情况,它只是临时解决方案


另外,请记住,它在
调试
配置中工作得最好,我不知道在方法不在StackTrace中时可能会发生什么优化,但当优化打开时,这种情况可能会发生。

它是您自己的源代码中的方法还是第三方库中的方法?它是您自己的源代码中的方法还是第三方库中的方法我不想在方法上中断。我只需要在调用堆栈中的某个方法(深度)时中断。好的,我看到了您编辑的问题。在这种情况下,您可以使用@Bartosz的解决方案检查调用堆栈,然后使用Debugger.break()添加断点。实际上,
Debugger.break()
似乎比我的“无操作”行要好得多,我的“无操作”行什么都不做,只是充当普通和断点的占位符:)我不想打断这个方法。只有当某个方法在调用堆栈中(很深)时,我才需要打断。好的,我看到了你编辑的问题。在这种情况下,您可以使用@Bartosz的解决方案检查调用堆栈,然后使用Debugger.Break()添加断点似乎比我的“无操作”行要好得多,我的“无操作”行什么都不做,只是充当普通VS断点的占位符:)这种基于反射的黑客行为使VS版本变得无关紧要。可能的好主意是检查:并可能开始新的记录单(如果那里已经没有发布类似的内容)。这种基于反射的黑客攻击使得VS版本变得无关紧要。可能最好检查:并可能启动新的罚单(如果那里已经没有发布类似的内容)。
Foo DBReadRecord()
{
     var trace = new StackTrace();
     if (trace.GetFrames().Reverse().FirstOrDefault(f => f.GetMethod().Name == "UserButtonDown") != null)
         Debugger.Break();
}