Condividi tramite


Controllo della destinazione

Durante il debug di un'applicazione di destinazione in modalità utente o in un computer di destinazione in modalità kernel, la destinazione può essere in esecuzione o arrestata.

Quando il debugger si connette a una destinazione in modalità kernel, il debugger lascia la destinazione in esecuzione, a meno che non si usi l'opzione della riga di comando -b, il sistema di destinazione ha smesso di rispondere (ovvero si è arrestato in modo anomalo) o il sistema di destinazione è ancora arrestato a causa di un'azione di debug del kernel precedente.

Quando il debugger viene avviato o si connette a una destinazione in modalità utente, il debugger arresta immediatamente la destinazione, a meno che non si usi l'opzione della riga di comando -g . Per altre informazioni, vedere Punto di interruzione iniziale.

Quando la destinazione è in esecuzione

Quando la destinazione è in esecuzione, la maggior parte delle azioni del debugger non è disponibile.

Se si vuole arrestare una destinazione in esecuzione, è possibile eseguire un comando Interrompi . Questo comando causa l'interruzione del debugger nella destinazione. Ovvero, il debugger arresta la destinazione e tutto il controllo viene assegnato al debugger. L'applicazione potrebbe non interrompersi immediatamente. Ad esempio, se tutti i thread eseguono il codice di sistema o si trovano in un'operazione di attesa, l'applicazione si interrompe solo dopo che il controllo è tornato al codice dell'applicazione.

Se una destinazione in esecuzione rileva un'eccezione, se si verificano determinati eventi , se viene raggiunto un punto di interruzione o se l'applicazione si chiude normalmente, la destinazione si interrompe nel debugger. Questa azione arresta la destinazione e assegna tutto il controllo al debugger. Viene visualizzato un messaggio nella finestra Di comando del debugger e viene descritto l'errore, l'evento o il punto di interruzione.

Quando la destinazione è arrestata

Per avviare o controllare l'esecuzione della destinazione, è possibile eseguire le operazioni seguenti:

  • Per fare in modo che l'applicazione inizi l'esecuzione, eseguire il comando Go .

  • Per eseguire un'istruzione alla volta nell'applicazione, usare i comandi Esegui istruzione o Esegui istruzione. Se si verifica una chiamata di funzione, Esegui istruzione entra nella funzione e continua a scorrere ogni istruzione. Step Over considera la chiamata di funzione come un singolo passaggio. Quando il debugger è in modalità assembly, viene eseguita un'istruzione del computer alla volta. Quando il debugger è in modalità origine, l'istruzione viene eseguita una riga di origine alla volta.

  • Per completare la funzione corrente e arrestarla quando viene restituito, usare i comandi Esci da istruzione o traccia e controllo . Il comando Step Out continua fino al termine della funzione corrente. Trace and Watch continua fino al termine della funzione corrente e visualizza anche un riepilogo delle chiamate della funzione. Tuttavia, è necessario eseguire il comando Trace and Watch sulla prima istruzione della funzione in questione.

  • Se si verifica un'eccezione, è possibile usare i comandi Go with Exception Handled e Go with Exception Not Handled per riprendere l'esecuzione e controllare lo stato dell'eccezione. Per altre informazioni sulle eccezioni, vedere Controllo di eccezioni ed eventi.

  • (solo WinDbg) Se si seleziona una riga nella finestra Disassembly o nella finestra Source e quindi si usa il comando Esegui al cursore , il programma viene eseguito fino a quando non rileva la riga selezionata.

  • (solo modalità utente) Per chiudere l'applicazione di destinazione e riavviarla dall'inizio, usare il comando Riavvia . È possibile usare questo comando solo con un processo creato dal debugger. Dopo il riavvio del processo, il processo si interrompe immediatamente nel debugger.

  • (solo WinDbg) Per chiudere l'applicazione di destinazione e cancellare il debugger, usare il comando Arresta debug . Questo comando consente di avviare il debug di una destinazione diversa.

Moduli di comando

La maggior parte dei comandi per avviare o controllare l'esecuzione della destinazione esiste come comandi di testo, comandi di menu, pulsanti della barra degli strumenti e tasti di scelta rapida. Come comandi di testo di base, è possibile usare questi comandi in CDB, KD o WinDbg. Il formato di testo dei comandi supporta spesso opzioni aggiuntive, ad esempio la modifica della posizione del contatore del programma o l'esecuzione di un numero fisso di istruzioni. È possibile usare i comandi di menu, i pulsanti della barra degli strumenti e i tasti di scelta rapida in WinDbg.

È possibile usare i comandi nei moduli seguenti.

Comando Comando WinDbg Tasti di scelta rapida winDbg Effetto

Debug | Esegui fino al cursore

F7

CTRL + F10

(solo WinDbg) Viene eseguito fino a raggiungere la riga contrassegnata dal cursore.

Debug | Arresta debug

MAIUSC + F5

Arresta tutto il debug e chiude la destinazione.

(solo CDB/KD) CTRL+C

Debug | Rompere

CTRL+INTERR

L'esecuzione si arresta e il debugger si suddivide nella destinazione.

.restart (Riavvia applicazione di destinazione)

Debug | Riavviare

CTRL + MAIUSC + F5

(solo modalità utente) Riavvia l'applicazione di destinazione.

g (Vai)

Debug | Andare

F5

La destinazione viene eseguita liberamente.

gc (vai dal punto di interruzione condizionale)

Riprende l'esecuzione dopo un punto di interruzione condizionale.

gh (Go with Exception Handled)

Debug | Eccezione gestita da Go

Uguale a g (Go), ad eccezione del fatto che l'eccezione corrente viene considerata come gestita.

gn (Go with Exception Not Handled)

Debug | Eccezione Go non gestita

Uguale a g (Go), ad eccezione del fatto che l'eccezione corrente viene considerata come non gestita.

gu (Vai su)

Debug | Esci dall'uscita

MAIUSC + F11

La destinazione viene eseguita fino al completamento della funzione corrente.

p (passaggio)

Debug | Eseguire il passaggio

F10

La destinazione esegue un'istruzione. Se questa istruzione è una chiamata di funzione, tale funzione viene eseguita come singolo passaggio.

pa (passaggio all'indirizzo)

La destinazione viene eseguita fino a raggiungere l'indirizzo specificato. Vengono visualizzati tutti i passaggi di questa funzione ( ma i passaggi in denominati funzioni non sono ).

pc (passaggio alla chiamata successiva)

La destinazione viene eseguita fino all'istruzione di chiamata successiva. Se l'istruzione corrente è un'istruzione di chiamata, questa chiamata viene eseguita completamente e l'esecuzione continua fino alla chiamata successiva.

pct (passaggio alla chiamata o al ritorno successivo)

La destinazione viene eseguita fino a raggiungere un'istruzione di chiamata o un'istruzione restituita .

ph (passaggio alla successiva istruzione di diramazione)

La destinazione viene eseguita fino a raggiungere qualsiasi tipo di istruzione di diramazione, inclusi rami condizionali o incondizionato, chiamate, restituzioni e chiamate di sistema.

pt (passaggio al successivo ritorno)

La destinazione viene eseguita fino a raggiungere un'istruzione restituita .

t (traccia)

Debug | Eseguire l'istruzione in

F11

F8

La destinazione esegue un'istruzione. Se questa istruzione è una chiamata di funzione, il debugger esegue la traccia in tale chiamata.

ta (traccia all'indirizzo)

La destinazione viene eseguita fino a raggiungere l'indirizzo specificato. Vengono visualizzati tutti i passaggi di questa funzione e le funzioni chiamate.

tb (traccia al ramo successivo)

(Tutte le modalità, ad eccezione della modalità kernel, solo nei sistemi basati su x86) La destinazione viene eseguita fino a raggiungere l'istruzione di ramo successiva.

tc (traccia alla chiamata successiva)

La destinazione viene eseguita fino all'istruzione di chiamata successiva. Se l'istruzione corrente è un'istruzione di chiamata , l'istruzione viene tracciata fino a quando non viene raggiunta una nuova chiamata .

tct (traccia alla chiamata o al ritorno successivo)

La destinazione viene eseguita fino a raggiungere un'istruzione di chiamata o un'istruzione restituita . Se l'istruzione corrente è un'istruzione di chiamata o un'istruzione return , l'istruzione viene tracciata fino a quando non viene raggiunta una nuova chiamata o restituita .

th (traccia all'istruzione di diramazione successiva)

La destinazione viene eseguita fino a raggiungere qualsiasi tipo di istruzione di diramazione, inclusi rami condizionali o incondizionato, chiamate, restituzioni e chiamate di sistema. Se l'istruzione corrente è un'istruzione di diramazione, l'istruzione viene tracciata fino a quando non viene raggiunta una nuova istruzione di diramazione.

tt (traccia al ritorno successivo)

La destinazione viene eseguita fino a raggiungere un'istruzione restituita . Se l'istruzione corrente è un'istruzione restituita , l'istruzione viene tracciata in finché non viene raggiunto un nuovo risultato .

wt (dati di traccia e controllo)

La destinazione viene eseguita fino al completamento dell'intera funzione specificata. Vengono quindi visualizzate le statistiche.

Per altre informazioni su come riavviare il computer di destinazione, vedere Arresto anomalo e riavvio del computer di destinazione.

Opzioni della riga di comando

Se non si vuole che l'applicazione venga interrotta immediatamente all'avvio o al caricamento, usare CDB o WinDbg insieme all'opzione della riga di comando -g . Per altre informazioni su questa situazione, vedere Punto di interruzione iniziale.

CDB e WinDbg supportano anche l'opzione della riga di comando -G. Questa opzione causa la fine della sessione di debug se l'applicazione viene completata correttamente.

Il comando seguente tenta di eseguire l'applicazione dall'inizio alla fine e il prompt del debugger viene visualizzato solo se si verifica un errore.

cdb -g -G ApplicationName 

È possibile usare l'opzione della riga di comando -pt per impostare il timeout dell'interruzione. Esistono alcuni problemi che possono rendere la destinazione incapace di comunicare con il debugger. Se viene eseguito un comando di interruzione e il debugger non può entrare nella destinazione dopo questa volta, il debugger visualizza un messaggio "Timeout di interruzione".

A questo punto, il debugger smette di tentare di eseguire l'interruzione nella destinazione. Il debugger sospende invece la destinazione e consente di esaminare (ma non controllare) l'applicazione di destinazione.

Il timeout predefinito è 30 secondi.