wt (Trace and Watch Data)
Der Wt-Befehl durchläuft die gesamte Funktion und zeigt dann Statistiken an, wenn Sie diesen Befehl am Anfang eines Funktionsaufrufs ausführen.
wt [WatchOptions] [= StartAddress] [EndAddress]
Parameter
WatchOptions
Gibt an, wie die Anzeige geändert wird. Sie können eine der folgenden Optionen verwenden.
Option | Effek |
---|---|
-l Tiefe |
(Nur Benutzermodus) Gibt die maximale Tiefe der anzuzeigenden Aufrufe an. Alle Aufrufe, die mindestens Tiefenebenen tiefer als der Startpunkt sind, werden im Hintergrund ausgeführt. |
-m Modul |
(Nur Benutzermodus) Beschränkt die Anzeige auf Code innerhalb des angegebenen Moduls sowie auf die erste Ebene der Aufrufe aus diesem Modul. Sie können mehrere -m-Optionen einschließen, um Code aus mehreren Modulen und keine anderen Module anzuzeigen. |
-i Modul |
(Nur Benutzermodus) Ignoriert code innerhalb des angegebenen Moduls. Sie können mehrere -i-Optionen einschließen, um Code aus mehreren Modulen zu ignorieren. Wenn Sie eine Option "-m" verwenden, ignoriert der Debugger alle -i-Optionen. |
-Ni |
(Nur Benutzermodus) Zeigt keinen Codeeintrag an, der aufgrund einer Option "-m" oder "-i" ignoriert wird. |
-NC |
Zeigt keine einzelnen Anrufinformationen an. |
-Ns |
Zeigt keine Zusammenfassungsinformationen an. |
-Nw |
Zeigt während der Ablaufverfolgung keine Warnungen an. |
-Oa |
(Nur Benutzermodus) Zeigt die tatsächliche Adresse von Anrufwebsites an. |
-or |
(Nur Benutzermodus) Zeigt die Rückgaberegisterwerte der aufgerufenen Funktion an, wobei der Standardradiix als Basis verwendet wird. |
-oder |
(Nur Benutzermodus) Zeigt die Rückgaberegisterwerte der aufgerufenen Funktion im entsprechenden Typ für jeden Rückgabewert an. |
StartAddress
Gibt die Adresse an, an der der Debugger mit der Ausführung beginnt. Wenn Sie StartAddress nicht verwenden, beginnt die Ausführung mit dem Befehl, auf den der Befehlszeiger zeigt. Weitere Informationen zur Syntax finden Sie unter Address and Address Range Syntax.
EndAddress
Gibt die Adresse an, an der die Ablaufverfolgung endet. Wenn Sie EndAddress nicht verwenden, wird ein einzelner Anweisungs- oder Funktionsaufruf ausgeführt.
Environment
Modi |
Benutzermodus, Kernel-Modus |
Targets |
Nur Livedebugging |
Plattformen |
Benutzermodus: der gesamte Kernelmodus: nur x86-basiert |
Zusätzliche Informationen
Weitere Informationen zum Ausgeben des Wt-Befehls und einer Übersicht über verwandte Befehle finden Sie unter Steuern des Ziels.
Hinweise
Der Wt-Befehl ist nützlich, wenn Sie Informationen zum Verhalten einer bestimmten Funktion benötigen, aber nicht die Funktion durchlaufen möchten. Wechseln Sie stattdessen zum Anfang dieser Funktion, und geben Sie dann den Wt-Befehl aus.
Wenn sich der Programmzähler an einem Punkt befindet, der einem Symbol (z. B. dem Anfang einer Funktion oder eines Einstiegspunkts in ein Modul) entspricht, verfolgt der Wt-Befehl , bis er die aktuelle Absenderadresse erreicht. Wenn sich der Programmzähler auf einer Aufrufanweisung befindet, verfolgt der wt-Befehl , bis er an die aktuelle Position zurückkehrt. Diese Ablaufverfolgung wird im Fenster "Debuggerbefehl " zusammen mit der Ausgabe profiliert, die die verschiedenen Aufrufe beschreibt, auf die der Befehl stößt.
Wenn der Wt-Befehl an einer anderen Stelle als dem Anfang einer Funktion ausgegeben wird, verhält sich der Befehl wie der Befehl p (Schritt). Wenn Sie jedoch EndAddress angeben, wird die Ausführung bis zum Erreichen dieser Adresse fortgesetzt, auch wenn diese Ausführung viele Programmschritte und Funktionsaufrufe umfasst.
Wenn Sie das Debuggen im Quellmodus ausführen, sollten Sie die Funktion nur auf den Punkt nachverfolgen, an dem die öffnende Klammer des Funktionstexts angezeigt wird. Anschließend können Sie den Wt-Befehl verwenden. (In der Regel ist es einfacher, einen Haltepunkt in die erste Zeile der Funktion einzufügen oder zu verwenden .Debuggen | Führen Sie den Cursor aus, und verwenden Sie dann den Wt-Befehl .)
Da die Ausgabe von wt lang sein kann, möchten Sie möglicherweise eine Protokolldatei verwenden, um Ihre Ausgabe aufzuzeichnen.
Das folgende Beispiel zeigt eine typische Protokolldatei.
0:000> l+ Source options set to show source lines
Source options are f:
1/t - Step/trace by source line
2/l - List source line for LN and prompt
4/s - List source code at prompt
8/o - Only show source code at prompt
0:000> p Not yet at the function call: use "p"
> 44: minorVariableOne = 12;
0:000> p
> 45: variableOne = myFunction(2, minorVariable);
0:000> t At the function call: now use "t"
MyModule!ILT+10(_myFunction):
0040100f e9cce60000 jmp MyModule!myFunction (0040f6e0)
0:000> t
> 231: {
0:000> wt At the function beginning: now use "wt"
Tracing MyModule!myFunction to return address 00401137
105 0 [ 0] MyModule!myFunction
1 0 [ 1] MyModule!ILT+1555(_printf)
9 0 [ 1] MyModule!printf
1 0 [ 2] MyModule!ILT+370(__stbuf)
11 0 [ 2] MyModule!_stbuf
1 0 [ 3] MyModule!ILT+1440(__isatty)
14 0 [ 3] MyModule!_isatty
50 15 [ 2] MyModule!_stbuf
17 66 [ 1] MyModule!printf
1 0 [ 2] MyModule!ILT+980(__output)
59 0 [ 2] MyModule!_output
39 0 [ 3] MyModule!write_char
111 39 [ 2] MyModule!_output
39 0 [ 3] MyModule!write_char
....
11 0 [ 5] kernel32!__SEH_epilog4
54 11675 [ 4] kernel32!ReadFile
165 11729 [ 3] MyModule!_read
100 11895 [ 2] MyModule!_filbuf
91 11996 [ 1] MyModule!fgets
54545 83789 [ 0] MyModule!myFunction
1 0 [ 1] MyModule!ILT+1265(__RTC_CheckEsp)
2 0 [ 1] MyModule!_RTC_CheckEsp
54547 83782 [ 0] MyModule!myFunction
112379 instructions were executed in 112378 events (0 from other threads)
Function Name Invocations MinInst MaxInst AvgInst
MyModule!ILT+1265(__RTC_CheckEsp) 1 1 1 1
MyModule!ILT+1440(__isatty) 21 1 1 1
MyModule!ILT+1540(__ftbuf) 21 1 1 1
....
ntdll!memcpy 24 1 40 19
ntdll!memset 2 29 29 29
23 system calls were executed
Calls System Call
23 ntdll!KiFastSystemCall
In der Auflistung der Ablaufverfolgung gibt die erste Zahl die Anzahl der ausgeführten Anweisungen an, die zweite Zahl gibt die Anzahl der Anweisungen an, die von untergeordneten Prozessen der Funktion ausgeführt werden, und die dritte Zahl (in Klammern) gibt die Tiefe der Funktion im Stapel an (wobei die anfängliche Funktion als Null verwendet wird). Der Einzug des Funktionsnamens zeigt die Aufruftiefe an.
Im vorherigen Beispiel führt MyModule!myFunction 105-Anweisungen aus, bevor mehrere Unterroutinen aufgerufen werden, einschließlich printf und fgets, und führt dann 54545 zusätzliche Anweisungen nach dem Aufrufen dieser Funktionen aus, aber bevor ein paar weitere Aufrufe ausgegeben werden. In der letzten Anzahl zeigt die Anzeige jedoch, dass myFunction 112.379 Anweisungen ausführt, da diese Anzahl alle Anweisungen enthält, die myFunction und seine untergeordneten Elemente ausführen. (Die untergeordneten Elemente von myFunction sind Funktionen, die direkt oder indirekt von myFunction aufgerufen werden.)
Beachten Sie im vorherigen Beispiel auch, dass ILT+1440 (__isatty) 21 Mal aufgerufen wird. In der letzten Anzahl zeigt die Zusammenfassung des Verhaltens dieser Funktion die Anzahl der Aufrufe, die kleinste Anzahl von Anweisungen in einer einzelnen Ausführung, die größte Anzahl von Anweisungen in einer einzelnen Ausführung und die durchschnittliche Anzahl von Anweisungen pro Ausführung.
Wenn Systemaufrufe ausgeführt werden, werden sie im Zähler angezeigt und am Ende der Befehlsausgabe erneut aufgelistet.