Esecuzione fino al raggiungimento di uno stato specificato

Esistono diversi modi per fare in modo che la destinazione venga eseguita fino a quando non viene raggiunto 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 per questo indirizzo prima di essere attivato,

  • eseguire automaticamente un comando specificato quando viene attivato o

  • watch un indirizzo specificato nella memoria non eseguibile, attivato quando tale 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 l'esecuzione 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 in corrispondenza di un determinato indirizzo, ma viene attivato solo se una condizione specificata contiene. 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 pseudoregistrazione, che è sempre uguale al valore del thread corrente. Viene risolto nel valore del thread corrente quando viene usato in un comando. Usando $thread come argomento del / t parametro del comando bp (Set Breakpoint), è 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 degli pseudoregistri automatici, vedere Pseudoregistra sintassi.

Uso di un file di script per controllare l'esecuzione

Un altro modo per eseguire fino a quando 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 vuole 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 corrisponde a $< (Esegui file script) che esegue il file eaxstep . Il file di script verifica il valore di eax, esegue il comando t e quindi si chiama 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 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 altre informazioni, vedere Risoluzione ambigua dei punti di interruzione.

Vedi anche

Uso dei punti di interruzione

Sintassi dei punti di interruzione

bp, bu, bm (Imposta punto di interruzione)

Risoluzione ambigua dei punti di interruzione

Punti di interruzione non risolti (punti di interruzione bu)