首页 > 解决方案 > 如何以编程方式引用 WinDbg 中的断点?

问题描述

编程断点 ID

断点语法(docs.microsoft.com) 声称这是关于使用 ID 表达式设置断点的。

断点 ID 不必显式引用。相反,您可以使用解析为与断点 ID 对应的整数的数值表达式。要指示表达式应解释为断点,请使用以下语法。

b?[Expression]

在此语法中,方括号是必需的,Expression 代表解析为对应于断点 ID 的整数的任何数值表达式。

这正是我想做的。但是,它似乎对我不起作用。他们举的一个例子

b?[@$t0]

产生语法错误。我尝试了其他几种方法。

0:000> r $t0 = 300
0:000> ? $t0
Evaluate expression: 768 = 00000300
0:000> b?[@$t0]
        ^ Syntax error in 'b?[@$t0]'
0:000> b0
        ^ Syntax error in 'b0'
0:000> b
        ^ Syntax error in 'b'
0:000> bl?[@$t0]
        ^ Syntax error in 'bl?[@$t0]'
0:000> bl
 0 e 77c27d89     0001 (0001)  0:**** ntdll!LdrpDoDebuggerBreak+0x2b
0:000> bl0
 0 e 77c27d89     0001 (0001)  0:**** ntdll!LdrpDoDebuggerBreak+0x2b
0:000> bl300
0:000>

我真的不知道给出的示例是否可行,因为b并且b0不起作用。但是,我似乎无法对使用硬编码值的命令使用类似的语法。

我怎样才能利用这个(神话?)功能?

(WinDbg 10.0.17134.12 X86)

标签: windbg

解决方案


什么是正则表达式替换这些 (p,u,a) 中的任何一个,它将表示 bp1 .. bpn | ba1 ... 禁令 | bu1 .. 小圆面包

0:000> bl
 0 e 62e5f7a0     0001 (0001)  xxx
 1 e 62e5f7a2     0001 (0001)  xxx
 2 e 62e5f7a3     0001 (0001)  xxx
 3 e 62e5f7a5     0001 (0001)  xxx

0:000> bp[8-5]
breakpoint 3 exists, redefining
breakpoint 0 redefined
0:000>

或更好的使用场景

0:000> bp .
0:000> bl
 0 e 77ac05a6     0001 (0001)  0:**** ntdll!LdrpDoDebuggerBreak+0x2c
0:000> r $t0 =0
0:000> bp[@$t0] ntdll!LdrpCompareServiceChecksum
breakpoint 0 exists, redefining
0:000> bl
 0 e 77a4b931     0001 (0001)  0:**** ntdll!LdrpCompareServiceChecksum
0:000> bp[@$t0] kernel32!CreateWaitableTimerExA
breakpoint 0 exists, redefining
0:000> bl
 0 e 77584202     0001 (0001)  0:**** kernel32!CreateWaitableTimerExA
0:000>

推荐阅读