我有以下递归的WinDBG脚本:
.if ($sicmp("${$arg1}", "-n") != 0)
{
r @$t0 = ${$arg1}
}
.if (@$t0)
{
r @$t1 = wo(@$t0+0x18)
.foreach /pS1 /ps1 (x {dq /c1 poi(@$t0+8)+0x10 L@$t1})
{
.echo x
r @$t2 = x
.push /r /q
r @$t0 = poi(@$t2+0x28)
$$>a< ${$arg0} -n
.pop /r /q
}
}
代码的灵感来自于此处的示例 - http://blogs.microsoft.co.il/sasha/2013/07/25/displaying-and-searching-stdmap-contents-in-windbg/#comment-2829748
问题在于我无法在$$>a< ${$arg0} -n
正文中调用.foreach
- 它已失败且别名已定义错误。
关于如何克服这个问题的任何想法?
答案 0 :(得分:0)
这似乎是 .foreach 命令的问题。我使用 .for 重写了脚本,它运行正常:
.if ($sicmp("${$arg1}", "-n") != 0)
{
r @$t0 = ${$arg1}
}
.if (@$t0)
{
r @$t1 = wo(@$t0+0x18)
.for (r @$t2 = 0; @$t2 < @$t1; r @$t2 = @$t2 + 1)
{
r @$t3 = poi(poi(@$t0+8)+(0x10 + @$t2 * 8))
.printf "%p\n", @$t3
.push /r /q
r @$t0 = poi(@$t3+0x28)
$$>a< ${$arg0} -n
.pop /r /q
}
}
答案是 - 如果可以,请使用.for
。