Windbg设置依赖于调用堆栈的条件断点

时间:2011-10-17 09:18:51

标签: c++ debugging windbg

问题:如果callstack上的某个地方是具有特定名称的函数,我需要创建一个不会破坏的脚本或表达式。

具体问题:如何将callstack上的函数转换为字符串列表?

示例

Module!MyFunctionWithConditionalBreakpoint    
Module!Function1   
Module!Function2    
Module!Function3  


Module!MyFunctionWithConditionalBreakpoint    
Module!Function1   
Module!ClassA:MemberFunction    
Module!Function3

我希望Module!MyFunctionWithConditionalBreakpoint仅在来自Module!ClassA:MemberFunction

的来电时中断

我需要非托管代码。托管解决方案就像

  

System.Diagnostics.StackTrace()。的ToString()。包含( “YourMethodName”)

2 个答案:

答案 0 :(得分:12)

在WinDbg中,您可以使用特殊的$ spat函数设置条件断点:

bp Module!MyFunctionWithConditionalBreakpoint "r $t0 = 0;.foreach (v { k }) { .if ($spat(\"v\", \"*Module!ClassA:MemberFunction*\")) { r $t0 = 1;.break } }; .if($t0 = 0) { gc }"

在伪代码中,它将类似于:

t0 = 0
foreach (token in k-command result) {
  if (token.contains("Module!ClassA:MemberFunction")) {
    t0 = 1
    break
  }
}
if (t0 == 0) {
  // continue execution
} else {
  // break into the debugger
}

答案 1 :(得分:1)

为什么不在输入Module时设置断点!ClassA:MemberFunction为Module!MyFunctionWithConditionalBreakpoint启用断点,并在离开Module!ClassA:MemberFunction禁用它?