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

Windbg Set Conditional Breakpoints that depends on Call Stack

本文关键字:条件断点 调用 依赖于 设置      更新时间:2023-10-16

问题:我需要制作一个脚本或表达式,如果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 () .Contains("YourMethodName")

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

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
}

为什么不在进入Module时设置一个断点呢?MemberFunction为Module启用断点!MyFunctionWithConditionalBreakpoint和离开Module!ClassA:MemberFunction禁用它?