递归WinDBG脚本不起作用

时间:2017-08-31 21:06:02

标签: recursion windbg

我有以下递归的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 - 它已失败且别名已定义错误。

关于如何克服这个问题的任何想法?

1 个答案:

答案 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