wt (Ablaufverfolgungs- und Überwachungsdaten)

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 werden soll. Sie können eine der folgenden Optionen verwenden.

Option Wirkung

-lTiefe

(Nur Benutzermodus) Gibt die maximale Tiefe der anzuzeigenden Aufrufe an. Alle Aufrufe, die mindestens Tiefenebenen tiefer als der Startpunkt sind, werden unbeaufsichtigt ausgeführt.

-mModul

(Nur Benutzermodus) Schränkt die Anzeige auf Code innerhalb des angegebenen Moduls sowie die erste Ebene der Aufrufe aus diesem Modul ein. Sie können mehrere -m-Optionen einschließen, um Code aus mehreren Modulen und keinem anderen Modul anzuzeigen.

-iModul

(Nur Benutzermodus) Ignoriert jeglichen Code innerhalb des angegebenen Moduls. Sie können mehrere -i-Optionen einschließen, um Code aus mehreren Modulen zu ignorieren. Wenn Sie eine -m-Option verwenden, ignoriert der Debugger alle -i-Optionen.

-Ni

(Nur Benutzermodus) Zeigt keinen Codeeintrag an, der aufgrund einer -m- oder -i-Option ignoriert wird.

-Nc

Zeigt keine einzelnen Anrufinformationen an.

-Ns

Es werden keine Zusammenfassungsinformationen angezeigt.

-Nw

Während der Ablaufverfolgung werden keine Warnungen angezeigt.

-Oa

(Nur Benutzermodus) Zeigt die tatsächliche Adresse der Anrufwebsites an.

-or

(Nur Benutzermodus) Zeigt die Rückgaberegisterwerte der aufgerufenen Funktion unter Verwendung des Standardradix als Basis an.

-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 der Anweisung, auf die der Anweisungszeiger verweist. Weitere Informationen zur Syntax finden Sie unter Adress- und Adressbereichssyntax.

EndAddress
Gibt die Adresse an, an der die Ablaufverfolgung endet. Wenn Sie EndAddress nicht verwenden, wird eine einzelne Anweisung oder ein einzelner Funktionsaufruf ausgeführt.

Environment

Modi

Benutzermodus, Kernelmodus

Ziele

Nur Livedebuggen

Plattformen

Benutzermodus: alle Kernelmodus: nur x86-basiert

Zusätzliche Informationen

Weitere Informationen zum Ausgeben des wt-Befehls und eine Übersicht über verwandte Befehle finden Sie unter Steuern des Ziels.

Hinweise

Der wt-Befehl ist nützlich, wenn Sie Informationen über das Verhalten einer bestimmten Funktion benötigen, aber die Funktion nicht schrittweise durchlaufen möchten. Wechseln Sie stattdessen zum Anfang dieser Funktion, und geben Sie dann den Befehl wt aus.

Wenn sich der Programmindikator an einem Punkt befindet, der einem Symbol entspricht (z. B. dem Anfang einer Funktion oder dem Einstiegspunkt in ein Modul), führt der wt-Befehl die Ablaufverfolgung durch, bis er die aktuelle Rückgabeadresse erreicht. Wenn sich der Programmindikator auf einer Aufrufanweisung befindet , führt der wt-Befehl die Ablaufverfolgung durch, bis er an den aktuellen Speicherort zurückkehrt. Diese Ablaufverfolgung wird im Debuggerbefehlsfenster zusammen mit der Ausgabe beschrieben, die die verschiedenen Aufrufe beschreibt, auf die der Befehl stößt.

Wenn der wt-Befehl an einer anderen Stelle als am Anfang einer Funktion ausgegeben wird, verhält sich der Befehl wie der Befehl p (Step). Wenn Sie jedoch EndAddress angeben, wird die Ausführung fortgesetzt, bis diese Adresse erreicht ist, auch wenn diese Ausführung viele Programmschritte und Funktionsaufrufe umfasst.

Beim Debuggen im Quellmodus sollten Sie die Funktion nur bis zu dem 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 der ersten Zeile der Funktion einzufügen oder Debuggen | Führen Sie zum Cursor aus, und verwenden Sie dann den Befehl wt .)

Da die Ausgabe von wt lang sein kann, sollten Sie 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 von 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 0 ist). Der Einzug des Funktionsnamens zeigt die Aufruftiefe an.

Im vorherigen Beispiel führt MyModule!myFunction 105 Anweisungen aus, bevor es mehrere Unterroutinen aufruft, einschließlich printf und fgets, und führt dann 54545 zusätzliche Anweisungen aus, nachdem diese Funktionen aufgerufen wurden, aber bevor einige weitere Aufrufe ausgegeben werden. In der endgültigen Anzahl zeigt die Anzeige jedoch an, 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 jeder einzelnen Ausführung, die größte Anzahl von Anweisungen in einer einzelnen Ausführung und die durchschnittliche Anzahl von Anweisungen pro Ausführung an.

Wenn Systemaufrufe ausgeführt werden, werden sie im Leistungsindikator angezeigt und am Ende der Befehlsausgabe erneut aufgeführt.