Windbg在寄存器值处设置断点。

6

我想在特定的寄存器上设置一个断点,每当该寄存器保存指定值时触发。

以下是一个示例:

mov eax,10
mov ebx,12
inc eax
dec eax

伪代码:
bp @eax=0x10 

我想在第1行和第4行断点。

注意:我不想仅在某个地址上创建断点。


我不熟悉这里,但似乎您需要跟踪程序并检查每个跟踪步骤的特定值。在我的调试器中,它看起来像是 tp FFFFF while eax != 10 silent 1,但我不知道windbg。 - ecm
5
通常您会有一个想要检查寄存器的位置,这样您就可以设置一个条件断点。否则,您必须逐步执行整个程序并在每条指令处测试条件,但即使是脚本化也会非常慢。 - Jester
3
@Jester:当然,x86确实有硬件数据断点(也称为监视点),每当内存中的特定地址被读取/写入时就会触发。当然,它并不取决于写入的值;调试器仍然需要在数据断点触发时通过软件进行测试。但是确实不存在寄存器的数据断点。因此我同意,在这种情况下,您必须手动设置条件断点,以便在写入eax时暂停执行每个指令,否则要单步执行。 - Nate Eldredge
1
如果您有汇编源代码,您可能希望在代码中添加 cmp eax,10 jne $+3 bpHere: nop 并重新汇编。 - vitsoft
你可以在这里查看一些替代流程 https://stackoverflow.com/questions/48785337/how-to-set-a-conditional-breakpoint-on-registers-value-in-windbg/48833576#48833576 - blabb
1个回答

2
在特定的内存地址处进行断点调试时,WinDbg 会得到 CPU 的帮助。
正如 Microsoft 所述:

有关特定处理器如何处理此情况的详细信息,请参阅处理器架构手册,并查找“调试寄存器”或“调试控制寄存器”。

因此,在 x86 机器上,WinDbg 使用 调试寄存器 DR0 到 DR3 进行数据断点调试。
我对 Intel CPU 架构文档 的 4800 页并不是非常熟悉,但我怀疑寄存器断点调试没有硬件支持。
因此,如果没有硬件支持,这并不意味着不能在软件中完成。然而,这基本上意味着您的程序将被单步执行,并且在每个指令之后检查寄存器值。这将变得非常缓慢。
虽然您可以使用p命令指定一个命令,但请注意它将跳过call指令,这可能不是您想要的。
因此,如果这不是一个XY-problem,您可能需要重新考虑。您认为解决方案是寄存器断点。但是有哪些问题需要解决,您认为寄存器断点是解决方案?在我14年的WinDbg调试经验中,我从未需要在特定寄存器值上中断。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接