Verwenden von Aliasen
Aliase sind Zeichenfolgen, die automatisch durch andere Zeichenfolgen ersetzt werden. Sie können sie in Debuggerbefehlen verwenden, um zu vermeiden, dass bestimmte allgemeine Ausdrücke neu eingegeben werden.
Ein Alias besteht aus einem Aliasnamen und einem Aliasäquivalent. Wenn Sie einen Aliasnamen als Teil eines Debuggerbefehls verwenden, wird der Name automatisch durch das Aliasäquivalent ersetzt. Diese Ersetzung erfolgt sofort, bevor der Befehl analysiert oder ausgeführt wird.
Der Debugger unterstützt drei Arten von Aliasen:
Sie können benutzerdefinierte Aliase festlegen und benennen.
Sie können Aliase mit festen Namen festlegen, aber sie heißen $u 0, $u 1, ..., $u 9.
Der Debugger legt automatische Aliase fest und benennt sie.
Definieren eines User-Named Alias
Wenn Sie einen alias mit Benutzernamen definieren, können Sie den Aliasnamen und das Aliasäquivalent auswählen:
Der Aliasname kann eine beliebige Zeichenfolge sein, die keine Leerzeichen enthält.
Das Aliasäquivalent kann eine beliebige Zeichenfolge sein. Wenn Sie es an der Tastatur eingeben, kann das Aliasäquivalent keine führenden Leerzeichen oder Wagenrückläufe enthalten. Alternativ können Sie sie gleich einer Zeichenfolge im Arbeitsspeicher, dem Wert eines numerischen Ausdrucks, dem Inhalt einer Datei, dem Wert einer Umgebungsvariablen oder der Ausgabe eines oder mehrerer Debuggerbefehle festlegen.
Sowohl beim Aliasnamen als auch beim Aliasäquivalent wird die Groß-/Kleinschreibung beachtet.
Verwenden Sie zum Definieren oder Umdefinieren eines benutzerseitig benannten Aliass den Befehl as (Alias festlegen) oder aS (Alias festlegen).
Um einen Alias zu entfernen, verwenden Sie den Befehl ad (Delete Alias).
Um alle aktuellen benutzernamenten Aliase aufzulisten, verwenden Sie den Befehl al (Listenaliases).
Definieren eines Fixed-Name Alias
Es gibt 10 Aliase mit festen Namen. Ihre Aliasnamen sind $u 0, $u 1, ..., $u 9. Ihre Aliasäquivalente können eine beliebige Zeichenfolge sein, die keine ENTER-Tasteneingabe enthält.
Verwenden Sie den Befehl r (Registers), um die Aliasäquivalente für Aliase mit festen Namen zu definieren. Wenn Sie einen Alias mit festen Namen definieren, müssen Sie einen Punkt (.) vor dem Buchstaben "u" einfügen. Der Text nach dem Gleichheitszeichen (=) ist das Aliasäquivalent. Das Aliasäquivalent kann Leerzeichen oder Semikolons enthalten, führende und nachfolgende Leerzeichen werden jedoch ignoriert. Sie sollten das Aliasäquivalent nicht in Anführungszeichen einschließen (es sei denn, Sie möchten in den Ergebnissen Anführungszeichen).
Hinweis Lassen Sie sich nicht verwechseln, indem Sie den Befehl r (Registers) für Aliase mit festen Namen verwenden. Diese Aliase sind keine Register oder Pseudoregister, obwohl Sie den r-Befehl verwenden, um ihre Aliasäquivalente festzulegen. Sie müssen vor diesen Aliasen kein at (@)-Zeichen hinzufügen, und Sie können den r-Befehl nicht verwenden, um den Wert eines dieser Aliase anzuzeigen .
Wenn Sie keinen Alias mit festen Namen definieren, handelt es sich standardmäßig um eine leere Zeichenfolge.
Automatische Aliase
Der Debugger legt die folgenden automatischen Aliase fest.
Aliasname | Aliasäquivalent |
---|---|
$ntnsym |
Das am besten geeignete Modul für NT-Symbole in der nativen Architektur des Computers. Dieser Alias kann entweder ntdll oder nt entsprechen. |
$ntwsym |
Das am besten geeignete Modul für NT-Symbole beim 32-Bit-Debuggen, das WOW64 verwendet. Dieser Alias kann ntdll32 oder eine andere 32-Bit-Version von Ntdll.dll sein. |
$ntsym |
Das am besten geeignete Modul für NT-Symbole, die dem aktuellen Computermodus entsprechen. Wenn Sie im einheitlichen Modus debuggen, ist dieser Alias mit $ntnsym identisch. Wenn Sie in einem nicht nativen Modus debuggen, versucht der Debugger, ein Modul zu finden, das diesem Modus entspricht. (Während des 32-Bit-Debuggings, das WOW64 verwendet, ist dieser Alias beispielsweise mit $ntwsym identisch.) |
$CurrentDumpFile |
Der Name der letzten Dumpdatei, die der Debugger geladen hat. |
$CurrentDumpPath |
Der Verzeichnispfad der letzten Dumpdatei, die der Debugger geladen hat. |
$CurrentDumpArchiveFile |
Der Name der letzten Speicherabbildarchivdatei (CAB-Datei), die der Debugger geladen hat. |
$CurrentDumpArchivePath |
Der Verzeichnispfad der letzten Dumparchivdatei (CAB-Datei), die der Debugger geladen hat. |
Automatische Aliase ähneln automatischen Pseudoregistern, mit der Ausnahme, dass Sie automatische Aliase mit aliasbezogenen Token (z. B . ${ }) verwenden können, während Sie mit diesen Token keine Pseudoregister verwenden können.
Verwenden eines Alias im Debuggerbefehlsfenster
Nachdem Sie einen Alias definiert haben, können Sie ihn in jedem Befehlseintrag verwenden. Der Aliasname wird automatisch durch das Aliasäquivalent ersetzt. Daher können Sie den Alias als Ausdruck oder als Makro verwenden.
Ein Aliasname wird ordnungsgemäß erweitert, auch wenn er in Anführungszeichen eingeschlossen ist. Da das Aliasäquivalent eine beliebige Anzahl von Anführungszeichen oder Semikolons enthalten kann, kann das Aliasäquivalent mehrere Befehle darstellen.
Ein benutzerdefinierter Alias wird nur erkannt, wenn sein Name durch Leerzeichen von anderen Zeichen getrennt ist. Das erste Zeichen des Aliasnamens muss die Zeile beginnen oder einem Leerzeichen, einem Semikolon oder einem Anführungszeichen folgen. Das letzte Zeichen des Aliasnamens muss die Zeile beenden oder durch ein Leerzeichen, ein Semikolon oder ein Anführungszeichen folgen.
Hinweis Jeder Text, den Sie in das Debuggerbefehlsfenster eingeben, der mit "as", "aS", "ad" oder "al" beginnt, erhält keinen Aliasersatz. Diese Einschränkung verhindert, dass die Aliasbefehle nicht funktionsfähig werden. Diese Einschränkung bedeutet jedoch auch, dass bei Befehlen, die der Anzeige oder al in einer Zeile folgen, die Aliase nicht ersetzt werden. Wenn Aliase in einer Zeile ersetzt werden sollen, die mit einer dieser Zeichenfolgen beginnt, fügen Sie dem Alias ein Semikolon hinzu.
Sie können jedoch das Token ${ } verwenden, um einen alias mit Benutzernamen zu erweitern, auch wenn er sich neben anderen Text befindet. Sie können dieses Token auch zusammen mit bestimmten Switches verwenden, um zu verhindern, dass ein Alias erweitert wird oder um bestimmte aliasbezogene Werte anzuzeigen. Weitere Informationen zu diesen Situationen finden Sie unter ${ } (Aliasinterpreter).
Ein Alias mit festen Namen wird von jedem Punkt innerhalb einer Zeile ordnungsgemäß erweitert, unabhängig davon, wie er im Text der Zeile eingebettet ist.
Sie können keine Befehle verwenden, die nur in WinDbg (.open, .write_cmd_hist (Write Command History),.lsrcpath und .lsrcfix) und einige zusätzliche Befehle (.hh, .cls, .wtitle, .remote, kernel-mode .restart und user-mode .restart) mit Aliasen verfügbar sind.
Verwenden eines Alias in einer Skriptdatei
Wenn Sie einen Alias in einer Skriptdatei verwenden, müssen Sie besonders darauf achten, dass der Alias zum richtigen Zeitpunkt erweitert wird. Betrachten Sie das folgende Skript:
.foreach (value {dd 610000 L4})
{
as /x ${/v:myAlias} value + 1
.echo value myAlias
}
ad myAlias
Beim ersten Durchlaufen der Schleife weist der Befehl as, aS (Set Alias) den myAlias einen Wert zu. Der myAlias zugewiesene Wert ist 1 plus 610000 (die erste Ausgabe des Befehls dd). Wenn jedoch der Befehl .echo (Echo Comment) ausgeführt wird, wurde myAlias noch nicht erweitert, sodass anstelle von 610001 der Text "myAlias" angezeigt wird.
0:001> $$>< c:\Script02.txt
00610000 myAlias
00905a4d 0x610001
00000003 0x905a4e
00000004 0x4
0000ffff 0x5
Das Problem besteht darin, dass myAlias erst erweitert wird, wenn ein neuer Codeblock eingegeben wird. Der nächste Eintrag in der Schleife ist ein neuer Block, sodass myAlias auf 610001 erweitert wird. Aber es ist zu spät: Wir hätten 610001 das erste Mal durch die Schleife sehen müssen, nicht das zweite Mal. Wir können dieses Problem beheben, indem wir den Befehl ECHO (Echo-Kommentar) in einen neuen Block einschließen, wie im folgenden Skript gezeigt.
.foreach (value {dd 610000 L4})
{
as /x ${/v:myAlias} value + 1
.block{.echo value myAlias}
}
ad myAlias
Mit dem geänderten Skript erhalten wir die folgende richtige Ausgabe.
0:001> $$>< c:\Script01.txt
00610000 0x610001
00905a4d 0x905a4e
00000003 0x4
00000004 0x5
0000ffff 0x10000
Weitere Informationen finden Sie unter .block und ${ } (Alias Interpreter).
Verwenden eines FOREACH-Tokens in einem Alias
Wenn Sie ein FOREACH-Token in der Definition eines Alias verwenden, müssen Sie besonders darauf achten, dass das Token erweitert wird. Betrachten Sie die folgende Befehlssequenz.
r $t0 = 5
ad myAlias
.foreach /pS 2 /ps 2 (Token {?@$t0}) {as myAlias Token}
al
Der erste Befehl legt den Wert des pseudoregisters $t 0 auf 5 fest. Der zweite Befehl löscht jeden Wert, der zuvor myAlias zugewiesen wurde. Der dritte Befehl übernimmt das dritte Token des Befehls ?@$t 0 und versucht, myAlias den Wert dieses Tokens zuzuweisen. Der vierte Befehl listet alle Aliase und ihre Werte auf. Wir würden erwarten, dass der Wert von myAlias 5 ist, aber stattdessen ist der Wert das Wort "Token".
Alias Value
------- -------
myAlias Token
Das Problem besteht darin, dass sich der as-Befehl am Anfang der Zeile im Textkörper der FOREACH-Schleife befindet. Wenn eine Zeile mit einem as-Befehl beginnt, werden Aliase und Token in dieser Zeile nicht erweitert. Wenn wir ein Semikolon oder leer vor dem als-Befehl platzieren, wird jeder Alias oder jedes Token, das bereits über einen Wert verfügt, erweitert. In diesem Beispiel wird myAlias nicht erweitert, da es nicht bereits über einen Wert verfügt. Token wird erweitert, da es den Wert 5 hat. Hier ist die gleiche Befehlssequenz mit dem Hinzufügen eines Semikolons vor dem - Befehl.
r $t0 = 5
ad myAlias
.foreach /pS 2 /ps 2 (Token {?@$t0}) {;as myAlias Token}
al
Jetzt erhalten wir die erwartete Ausgabe.
Alias Value
------- -------
myAlias 5
Rekursive Aliase
Sie können einen Alias mit festen Namen in der Definition eines beliebigen Alias verwenden. Sie können auch einen benutzerdefinierten Alias in der Definition eines Alias mit festen Namen verwenden. Um jedoch einen benutzerdefinierten Alias in der Definition eines anderen benutzerdefinierten Aliases zu verwenden, müssen Sie vor dem Befehl as oder aS ein Semikolon hinzufügen, andernfalls tritt der Aliasersetzung in dieser Zeile nicht auf.
Wenn Sie rekursive Definitionen dieses Typs verwenden, wird jeder Alias übersetzt, sobald er verwendet wird. Im folgenden Beispiel wird beispielsweise 3, nicht 7 angezeigt.
0:000> r $.u2=2
0:000> r $.u1=1+$u2
0:000> r $.u2=6
0:000> ? $u1
Evaluate expression: 3 = 00000003
In ähnlicher Weise wird im folgenden Beispiel 3 und nicht 7 angezeigt.
0:000> as fred 2
0:000> r $.u1= 1 + fred
0:000> as fred 6
0:000> ? $u1
Evaluate expression: 3 = 00000003
Das folgende Beispiel ist ebenfalls zulässig und zeigt 9 an.
0:000> r $.u0=2
0:000> r $.u0=7+$u0
0:000> ? $u0
Evaluate expression: 9 = 00000009
Aliasbeispiele
Sie können Aliase verwenden, damit Sie keine langen oder komplexen Symbolnamen eingeben müssen, wie im folgenden Beispiel dargestellt.
0:000> as Short usersrv!NameTooLongToWantToType
0:000> dw Short +8
Das folgende Beispiel ähnelt dem vorherigen Beispiel, verwendet jedoch einen Alias mit festem Namen.
0:000> r $.u0=usersrv!NameTooLongToWantToType
0:000> dw $u0+8
Sie können Aliase als Makros für Befehle verwenden, die Sie häufig verwenden. Im folgenden Beispiel werden die Register eax und ebx zweimal erhöht.
0:000> as GoUp r eax=eax+1; r ebx=ebx+1
0:000> GoUp
0:000> GoUp
Im folgenden Beispiel wird ein Alias verwendet, um die Eingabe von Befehlen zu vereinfachen.
0:000> as Cmd "dd esp 14; g"
0:000> bp MyApi Cmd
Das folgende Beispiel ähnelt dem vorherigen Beispiel, verwendet jedoch einen Alias mit festem Namen.
0:000> r $.u5="dd esp 14; g"
0:000> bp MyApi $u5
Die beiden vorherigen Beispiele entsprechen dem folgenden Befehl.
0:000> bp MyApi "dd esp 14; g"
Tools.ini Datei
In CDB (und NTSD) können Sie in der dateitools.ini vordefinierte Aliase mit festen Namen festlegen. Um einen Alias mit festem Namen vorzudefinieren, fügen Sie dem Eintrag [NTSD] die gewünschten $u Felder hinzu, wie im folgenden Beispiel gezeigt.
[NTSD]
$u1:_ntdll!_RtlRaiseException
$u2:"dd esp 14;g"
$u9:$u1 + 42
Sie können in der Tools.ini-Datei keine benutzerdefinierten Aliase festlegen.
Fixed-Name Aliase im Vergleich zu User-Named Aliasen
Benutzernamenalias sind einfacher zu verwenden als Aliase mit festen Namen. Ihre Definitionssyntax ist einfacher, und Sie können sie mit dem Befehl al (Listenaliases) auflisten.
Fest benannte Aliase werden ersetzt, wenn sie neben anderen Texten verwendet werden. Um einen Benutzernamen-Alias zu ersetzen, wenn er sich neben einem anderen Text befindet, schließen Sie ihn in das Token ${ } (AliasInterpreter) ein.
Der Ersatz von Aliasen mit festen Namen erfolgt vor dem Ersetzen von aliasen mit Benutzernamen.