【问题标题】:Examine data in windbg when a break on address (ba) breakpoint is hit命中地址 (ba) 断点时检查 windbg 中的数据
【发布时间】:2009-12-22 04:40:52
【问题描述】:

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

所以当断点被命中时,我想运行如下命令:

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

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

有人对如何创建一个可以“dd”断点内存地址的断点命令有任何想法吗?

谢谢!

【问题讨论】:

    标签: windbg breakpoints


    【解决方案1】:

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

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

    【讨论】:

    • 如果 'your-address' 断点被命中两次(在命中 'your-other-address' 之前),这是否会改变 $t1 的值并导致两个一次性断点dd @$t1 在同一个地址?谢谢!!!
    • 在这种情况下,将断点保持在最低限度。知道您在“您的地址”上有一个,它还可以重置所有其他 bps。在其条件中使用类似“bc1-10”的内容(前提是“您的地址”在 bp0 上!)以摆脱最后 10 个尚未命中的断点。
    • 或者,您可以将 $t1 设置为 0(以确保 ;o)并在单次 bp 中将其重置为 0。然后简单地测试 0(或其他值)并仅在满足特定条件(例如为 0)时创建一个新的单次 bp。
    【解决方案2】:

    如果您知道定义的“子”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 确保别名扩展发生在接下来的内容中。
    • 别名解释器随后将展开块中所有出现的“baaddy”,ad 命令除外(因为 /v 开关)。
    • 所以如果@esp+4 的值是0x1234,那么访问断点命令就变成:ba w4 /1 0x1234 \"dd 0x1234\",其中嵌入了实际地址。
    • 然后删除文本别名。

    请务必在末尾删除文本别名,或者在下一次命中此控制断点时,别名扩展将发生在aS 命令之前,并且“baaddy”将使用扩展上一个值。这也意味着这段文字很重要 第一次设置控制断点的命令时别名不存在。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-06
      • 1970-01-01
      相关资源
      最近更新 更多