wt (dati di traccia e controllo)
Il comando wt viene eseguito attraverso l'intera funzione e quindi visualizza le statistiche, quando si esegue questo comando all'inizio di una chiamata di funzione.
wt [WatchOptions] [= StartAddress] [EndAddress]
Parametri
WatchOptions
Specifica come modificare la visualizzazione. È possibile usare una delle opzioni seguenti.
Opzione | Effetto |
---|---|
-l Depth |
(solo modalità utente) Specifica la profondità massima delle chiamate da visualizzare. Tutte le chiamate che sono almeno livelli di profondità più profondi rispetto al punto iniziale vengono eseguite in modo invisibile all'utente. |
Modulo -m |
(solo modalità utente) Limita la visualizzazione al codice all'interno del modulo specificato, oltre al primo livello di chiamate effettuate da tale modulo. È possibile includere più opzioni -m per visualizzare il codice da più moduli e nessun altro modulo. |
-i Module |
(solo modalità utente) Ignora qualsiasi codice all'interno del modulo specificato. È possibile includere più opzioni -i per ignorare il codice da più moduli. Se si usa un'opzione -m, il debugger ignora tutte le opzioni -i. |
-Ni |
(solo modalità utente) Non visualizza alcuna voce nel codice che viene ignorata a causa di un'opzione -m o -i. |
-Nc |
Non visualizza informazioni sulle singole chiamate. |
-Ns |
Non visualizza informazioni di riepilogo. |
-Nw |
Non vengono visualizzati avvisi durante la traccia. |
-oa |
(solo modalità utente) Visualizza l'indirizzo effettivo dei siti di chiamata. |
-or |
(solo modalità utente) Visualizza i valori del registro restituito della funzione chiamata, utilizzando il valore predefinito di radix come base. |
-o |
(solo modalità utente) Visualizza i valori del registro restituito della funzione chiamata, nel tipo appropriato per ogni valore restituito. |
StartAddress
Specifica l'indirizzo in cui inizia l'esecuzione del debugger. Se non si usa StartAddress, l'esecuzione inizia con l'istruzione a cui punta il puntatore dell'istruzione. Per altre informazioni sulla sintassi, vedere Sintassi dell'intervallo di indirizzi e dell'intervallo di indirizzi.
EndAddress
Specifica l'indirizzo in cui termina la traccia. Se non si usa EndAddress, viene eseguita una singola istruzione o chiamata di funzione.
Ambiente
Modalità |
Modalità utente, modalità kernel |
Destinazioni |
Solo debug in tempo reale |
Piattaforme |
Modalità utente: tutta la modalità kernel: solo basata su x86 |
Informazioni aggiuntive
Per altre informazioni sull'emissione del comando wt e una panoramica dei comandi correlati, vedere Controllo della destinazione.
Osservazioni:
Il comando wt è utile se si desidera ottenere informazioni sul comportamento di una funzione specifica, ma non si vuole scorrere la funzione. Passare invece all'inizio di tale funzione e quindi eseguire il comando wt .
Se il contatore del programma è in corrispondenza di un punto che corrisponde a un simbolo (ad esempio l'inizio di una funzione o di un punto di ingresso in un modulo), il comando wt traccia fino a raggiungere l'indirizzo restituito corrente. Se il contatore del programma si trova in un'istruzione di chiamata , il comando wt viene tracciato fino a quando non torna alla posizione corrente. Questa traccia viene profilata nella finestra Di comando del debugger insieme all'output che descrive le varie chiamate incontrate dal comando.
Se il comando wt viene emesso in un punto diverso dall'inizio di una funzione, il comando si comporta come il comando p (passaggio). Tuttavia, se si specifica EndAddress, l'esecuzione continua fino a quando non viene raggiunto l'indirizzo, anche se questa esecuzione prevede molti passaggi del programma e chiamate di funzione.
Quando si esegue il debug in modalità di origine, è necessario accedere alla funzione solo al punto in cui viene visualizzata la parentesi quadra di apertura del corpo della funzione. È quindi possibile usare il comando wt . In genere è più semplice inserire un punto di interruzione alla prima riga della funzione o usare Debug | Eseguire su Cursore e quindi usare il comando wt .
Poiché l'output di wt può essere lungo, è possibile usare un file di log per registrare l'output.
Nell'esempio seguente viene illustrato un file di log tipico.
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
Nell'elenco della traccia, il primo numero specifica il numero di istruzioni eseguite, il secondo numero specifica il numero di istruzioni eseguite dai processi figlio della funzione e il terzo numero (tra parentesi quadre) specifica la profondità della funzione nello stack (accettando la funzione iniziale come zero). Il rientro del nome della funzione mostra la profondità della chiamata.
Nell'esempio precedente MyModule !myFunction esegue 105 istruzioni prima di chiamare diverse subroutine, inclusi printf e fget, e quindi esegue 54545 istruzioni aggiuntive dopo aver chiamato tali funzioni, ma prima di eseguire altre chiamate. Tuttavia, nel conteggio finale, la visualizzazione mostra che myFunction esegue 112.379 istruzioni, perché questo conteggio include tutte le istruzioni eseguite da myFunction e dai relativi elementi figlio. Gli elementi figlio di myFunction sono funzioni chiamate da myFunction, direttamente o indirettamente.
Nell'esempio precedente si noti anche che ILT+1440 (__isatty) viene chiamato 21 volte. Nel conteggio finale il riepilogo del comportamento di questa funzione mostra il numero di chiamate, il numero più piccolo di istruzioni in qualsiasi singola esecuzione, il maggior numero di istruzioni in qualsiasi singola esecuzione e il numero medio di istruzioni per esecuzione.
Se vengono effettuate chiamate di sistema, vengono visualizzate nel contatore e vengono elencate di nuovo alla fine dell'output del comando.