我希望在调用堆栈中存在某种方法时触发断点。 我可以使用Visual Studio调试器以某种方式执行此操作吗?
我想确保在从某些方法调用代码时会触发我的断点,而不是其他方法。
例如,我们有两个调用堆栈:
DBReadRecord()
GetRecord()
ActivityMonitor()
和
DBReadRecord()
GetRecord()
UserButtonDown()
我希望DBReadRecord
中的断点仅在从UserButtonDown()
方法调用而不是从ActivityMonitor()
方法调用时才会被点击。
我正在使用Visual Studio 10和.Net 3.5。
答案 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()
。