2017-08-31 55 views
0

我有以下遞歸的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 [email protected]$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

的問題是,我不能從.foreach中調用$$>a< ${$arg0} -n身體 - 它與失敗別名已經定義錯誤。

有關如何克服這一點的任何想法?

+0

你真的想以這種方式編寫腳本嗎?沒有機會讓PyKd啓動並運行? –

+0

現在 - 是的。至於PyKd - 可能會晚一些。 – mark

+0

我有更多問題。我正在探索的圖包含循環引用,所以爲了計算我需要緩存訪問一次的節點(我不想修改節點本身的內存)。不知道如何在純WinDBG中做到這一點。所以,我願意嘗試PyKd,但害怕設置。任何指針? – mark

回答

0

這似乎是.foreach命令的問題。我已經重寫使用。對於腳本,它工作正常:

.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,如果你能。