当地址(ba)断点被击中时,检查windbg中的数据

时间:2009-12-22 04:40:52

标签: windbg breakpoints

我想创建一个断点,这样它就会创建另一个一次性断点,当写入该内存时,该断点将“写入”某个内存地址。

因此,当断点被击中时,我想运行如下命令:

  ba w4 @ESP+4 /1 ''dd [memory address of this breakpoint]''

由于此断点是由另一个断点创建的(并且可能被多次调用),因此我无法指定断点号。否则我可以使用像'$ bp3'这样的伪寄存器来获取断点#3的内存地址

有没有人想过如何创建一个可以'dd'断点的内存地址的断点命令?

谢谢!

2 个答案:

答案 0 :(得分:1)

您可以详细说明如何使用其他通用伪寄存器:t0..t19

bp your-address "r$t1=your-other-address; ba w4 @$t1 /1 \"dd @$t1;gc\""

答案 1 :(得分:0)

如果您知道永远不会有多个“子”ba断点定义,您可以通过将“控制”断点的命令设置为:@$bpN伪寄存器>

ba1 w4 /1 @esp+4 "dd @$bp1"

即,指定应该分配此新断点的断点号,并且该断点的伪寄存器仍然在断点的命令中定义。

但是,如果您认为控制断点将被多次命中并且需要定义多个ba断点,那么这显然是行不通的,因为每次都会重新定义“断点1”。但你仍然可以做到!

诀窍是让控制断点的命令实际上包含文字地址文本而不是尝试通过伪寄存器。你可以用文本别名来做到这一点。

尝试使用此控制断点:

bu @WHATEVER "aS /x ${/v:baaddy} @esp+4; .block{ ba w4 /1 baaddy \"dd baaddy\"; ad ${/v:baaddy} }"

当控制断点被击中时,会发生以下情况:

  • 为文本“baaddy”设置别名,其中评估表达式@esp+4
  • .block确保后续发生别名扩展。
  • 除了ad命令(因为/ v开关)之外,别名解释器将扩展块中所有出现的“baaddy”。
  • 因此,如果@esp+4的值为0x1234,则访问断点命令将逐渐变为:ba w4 /1 0x1234 \"dd 0x1234\",其中嵌入了实际地址。
  • 然后删除文本别名。

在结束时删除文本别名或下次触发此控制断点非常重要,别名扩展将在aS命令之前发生,并且“baaddy”将是使用之前的值进行扩展。这也意味着这篇文章很重要 第一次设置控制断点的命令时,别名不存在。