2017-08-31 1 views
0

Ich habe folgendes rekursiv WinDBG Skript:rekursive WinDBG Skript nicht funktioniert

.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 
    } 
} 

Der Code durch ein Beispiel hier inspiriert - http://blogs.microsoft.co.il/sasha/2013/07/25/displaying-and-searching-stdmap-contents-in-windbg/#comment-2829748

Das Problem ist, dass ich nicht $$>a< ${$arg0} -n aus dem .foreach aufrufen Körper - es schlägt mit Alias ​​bereits definiert Fehler.

Irgendwelche Ideen, wie Sie das überwinden können?

+0

Möchten Sie es wirklich so skripten? Keine Chance, PyKd zum Laufen zu bringen? –

+0

Gerade jetzt - ja. Wie für PyKd - vielleicht später. – mark

+0

Ich habe mehr Probleme. Der Graph, den ich untersuche, enthält zyklische Referenzen. Um also die Knoten zu zählen, die ich einmal besucht habe (ich will den Speicher der Knoten nicht selbst verändern). Keine Ahnung wie man es in reinem WinDBG macht. Also, ich bin bereit, PyKd zu versuchen, aber Angst vor dem Setup. Irgendwelche Zeiger? – mark

Antwort

0

Dies scheint ein Problem mit dem Befehl .foreach zu sein. Ich habe das Skript neu geschrieben .für verwenden und es funktioniert gut:

.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 
    } 
} 

Die Antwort ist also - verwenden .for, wenn Sie können.