Condividi tramite


Esecuzione fino a quando non viene raggiunto uno stato specificato

Esistono diversi modi per far eseguire l'obiettivo fino al raggiungimento di uno stato specificato.

Uso di un punto di interruzione per controllare l'esecuzione

Un metodo consiste nell'usare un punto di interruzione. Il punto di interruzione più semplice interrompe l'esecuzione quando il contatore del programma raggiunge un indirizzo specificato. Un punto di interruzione più complesso può:

  • essere attivato solo quando questo indirizzo viene eseguito da un thread specifico,

  • consentire un numero specificato di passaggi attraverso questo indirizzo prima di attivarsi,

  • eseguire automaticamente un comando specificato quando viene attivato o

  • controllare un indirizzo specificato nella memoria non eseguibile, che si attiva quando quella memoria viene letta o scritta.

Per informazioni dettagliate su come impostare e controllare i punti di interruzione, vedere Uso dei punti di interruzione.

Un modo più complesso per eseguire fino a quando non viene raggiunto uno stato specificato consiste nell'usare un punto di interruzione condizionale. Questo tipo di punto di interruzione viene impostato su un determinato indirizzo, ma si attiva solo se è soddisfatta una condizione specificata. Per informazioni dettagliate, vedere Impostazione di un punto di interruzione condizionale.

Punti di interruzione e Pseudo-Registers

Per specificare lo stato desiderato, è spesso utile usare pseudoregistri automatici. Si tratta di variabili controllate dal debugger che consentono di fare riferimento a un'ampia gamma di valori correlati allo stato di destinazione.

Ad esempio, il punto di interruzione seguente usa il $thread pseudoregistro, che è sempre uguale al valore del thread corrente. Si risolve nel valore del thread corrente quando viene utilizzato in un comando. Usando $thread come argomento del parametro /t del comando bp (Imposta punto di interruzione), è possibile creare un punto di interruzione che verrà attivato ogni volta che NtOpenFile viene chiamato dal thread attivo al momento dell'esecuzione del comando bp :

kd> bp /t @$thread nt!ntopenfile

Questo punto di interruzione non verrà attivato quando qualsiasi altro thread chiama NtOpenFile.

Per un elenco di pseudoregistri automatici, vedere Pseudo-Register Sintassi.

Uso di un file di script per controllare l'esecuzione

Un altro modo per eseguire finché non viene raggiunto uno stato specificato consiste nel creare un file di script che si chiama in modo ricorsivo, testando lo stato desiderato in ogni iterazione.

In genere, questo file di script conterrà i token .if e .else . È possibile usare un comando come t (Traccia) per eseguire un singolo passaggio e quindi testare la condizione in questione.

Ad esempio, se si desidera eseguire fino a quando il registro eax non contiene il valore 0x1234, è possibile creare un file di script denominato eaxstep contenente la riga seguente:

.if (@eax == 1234) { .echo 1234 } .else { t "$<eaxstep" }

Eseguire quindi il comando seguente dalla finestra Di comando del debugger:

t "$<eaxstep"

Questo comando t eseguirà un singolo passaggio e quindi eseguirà il comando tra virgolette. Questo comando è $< (Esegui file script) che esegue il file eaxstep . Il file di script verifica il valore di eax, esegue il comando t e quindi chiama se stesso in modo ricorsivo. Questo continua fino a quando il registro eax è uguale a 0x1234, a quel punto il comando echo (Echo Comment) stampa un messaggio nella finestra di comando del debugger e l'esecuzione si arresta.

Per informazioni dettagliate sui file di script, vedere Uso di file di script e Uso dei programmi di comando del debugger.

Risoluzione ambigua dei punti di interruzione

Nella versione 10.0.25310.1001 e successive del motore del debugger è ora supportata la risoluzione ambigua dei punti di interruzione. I punti di interruzione ambigui consentono al debugger di impostare punti di interruzione in determinati scenari in cui un'espressione del punto di interruzione viene risolta in più posizioni. Per ulteriori informazioni, vedere Risoluzione ambigua dei punti di interruzione.

Vedere anche

uso di punti di interruzione

Sintassi del punto di interruzione

bp, bu, bm (Imposta punto di interruzione)

Risoluzione ambigua dei punti di interruzione

Punti di interruzione non risolti (punti di interruzione bu)