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
)
Für eine unvollständige Antwort finden Sie unter [diese Frage] (http://Stackoverflow.com/q/1629085/1020072). –