2016-05-25 10 views
3

Ich sehe einige Referenzen und Tutorials über die Commnads von WinDBG. Einige mögen diese lm, diese .echo, diese !running, und diese nt!_PDB.Die Kategorien von Befehlen von WinDBG?

Was ist der Unterschied zwischen diesen Kategorien

  • xxx
  • .xxx
  • ! Xxx
  • xxx! Yyy

?

Sie sehen so verwirrt aus.

+0

Für eine unvollständige Antwort finden Sie unter [diese Frage] (http://Stackoverflow.com/q/1629085/1020072). –

Antwort

7

Es gibt integrierte Befehle, Meta-Befehle (Punktbefehle) und Erweiterungsbefehle (Knall-Befehle).

Meine persönliche Meinung ist, dass Sie nicht zu viel über den Unterschied von integrierten Befehlen im Vergleich zu Meta-Befehlen kümmern müssen, da es genug Beispiele gibt, wo diese Definitionen nicht richtig übereinstimmen. Es genügt zu wissen, dass sie immer da sind und keine Erweiterung benötigen, um geladen zu werden.

Gute Beispiele für integrierte Befehle, die vor allem über die Steuerung und Informationen aus dem Debug-Ziel erhalten:

g - go 
k - call stack 
~ - list threads 

Beispiele, bei denen IMHO diese Definition nicht wirklich entsprechen:

version - show version of the debugger 
vercommand - show command line that was used to start the debugger 
n   - set number base 

Gut Beispiele für Meta-Befehle, die nur für den Debugger gedacht sind, aber nicht für das Ziel:

.cls  - clear screen 
.chain  - display loaded extensions 
.effmach - change behavior of the debugger regarding the architecture 
.prefer_dml - change output format 

Beispiel, wo IMHO diese Definition nicht wirklich passen:

.lastevent - show last exception or event that occurred (in the target) 
.ttime  - display thread times (of the target) 
.call  - call a function (in the target) 
.dvalloc - allocate memory (in the target) 

Allerdings ist es gut, dass die Erweiterungsbefehle unterschiedlich sind, zu verstehen, vor allem, weil der gleiche Befehl in unterschiedlicher Ausgabe führen kann, je nachdem, welche Erweiterung geladen wird oder erscheint zuerst in der Erweiterungsliste und Sie können die Reihenfolge beeinflussen (z. B. durch .load, .unload, .setdll). Beachten Sie, dass neben der einfachen Form !command auch die !extension.command-Syntax zur expliziten Angabe der Erweiterung vorhanden ist. Ich werde es im folgenden Beispiel verwenden. (Es gibt sogar !c:\path\to\extension.command)

Das Beispiel einer Kollision von Erweiterungsbefehlen wird von einer Kernel-Debugsitzung gegeben, wo man !heap keine Ausgabe gibt und die andere offensichtlich einen Parameter benötigt, um zu arbeiten.

0: kd> !ext.heap 
0: kd> !exts.heap 
Invalid type information 

Das letzte Format in Ihrer Frage erwähnt (xxx!yyy) ist kein Befehl, sondern eine Methode oder Informationen geben, wobei xxx das Modul (DLL) und yyy bezeichnet bezeichnet die Methode oder Typnamen. Oft wird dies auch mit einem zusätzlichen Offset in Byte für Positionen in der Methode angezeigt (xxx!yyy+0xhhh)

+0

Danke für Ihre Erklärung! – KyL

+0

Große Antwort. Ich bin froh, dass Sie darauf hingewiesen haben, dass es keine strenge Unterscheidung zwischen integrierten Befehlen und Meta-Befehlen gibt. Es gibt viele weitere Beispiele, wo diese Arten von Befehlen nicht zu ihrer Kategorisierung passen. – user1354557

2

Siehe folgendes:

xxx - these are built in commands 
.xxx - these are meta commands 
!xxx - these are extension commands, so they call a command from an extension dll 
xxx!yyy - this looks the syntax to reference an exported function from a dll: 

<dll_name>!<method_name> 

Sie können die folgenden nützlich finden: http://windbg.info/doc/1-common-cmds.html

Verwandte Themen