Condividi tramite


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.