Condividi tramite


Controllo di eccezioni ed eventi

È possibile intercettare e gestire le eccezioni nelle applicazioni in modalità utente e in modalità kernel da un'ampia gamma di metodi. Un debugger attivo, un debugger postmortem o una routine di gestione degli errori interni sono tutti modi comuni per gestire le eccezioni.

Per altre informazioni sull'ordine di precedenza di questi vari gestori di eccezioni, vedere Abilitazione del debug postmortem.

Quando il sistema operativo Microsoft Windows consente a un debugger di gestire un'eccezione, l'applicazione che ha generato l'eccezione si interrompe nel debugger. Ovvero, l'applicazione si arresta e il debugger diventa attivo. Il debugger può quindi gestire l'eccezione in qualche modo o analizzare la situazione. Il debugger può quindi terminare il processo o consentire la ripresa dell'esecuzione.

Se il debugger ignora l'eccezione e consente all'applicazione di continuare l'esecuzione, il sistema operativo cerca altri gestori di eccezioni come se non fosse presente alcun debugger. Se l'eccezione viene gestita, l'applicazione continua a essere in esecuzione. Tuttavia, se l'eccezione rimane non gestita, al debugger viene data una seconda opportunità per gestire la situazione.

Uso del debugger per analizzare un'eccezione

Quando un'eccezione o un evento si interrompe nel debugger, è possibile usare il debugger per esaminare il codice in esecuzione e la memoria usata dall'applicazione. Modificando determinate quantità o passando a un punto diverso nell'applicazione, è possibile rimuovere la causa dell'eccezione.

È possibile riprendere l'esecuzione eseguendo un comando gh (Go with Exception Handled) o gn (Go with Exception Not Handled).

Se si esegue il comando gn nella seconda opportunità del debugger di gestire l'eccezione, l'applicazione termina.

eccezioniKernel-Mode

Le eccezioni che si verificano nel codice in modalità kernel sono più gravi delle eccezioni in modalità utente. Se le eccezioni in modalità kernel non vengono gestite, viene eseguito un controllo dei bug e il sistema si arresta.

Come per le eccezioni in modalità utente, se un debugger in modalità kernel è collegato al sistema, il debugger riceve una notifica prima che venga visualizzata la schermata di controllo dei bug (nota anche come schermata blu). Se non è collegato alcun debugger, viene visualizzata la schermata di controllo dei bug. In questo caso, il sistema operativo potrebbe creare un file di crash dump.

Controllo di eccezioni ed eventi dal debugger

È possibile configurare il debugger in modo da reagire alle eccezioni e agli eventi specificati in modo specifico.

Il debugger può impostare lo stato di interruzione per ogni eccezione o evento:

  • L'evento può causare un'interruzione nel debugger non appena si verifica (la "prima probabilità").

  • L'evento può interrompersi dopo che altri gestori di errori hanno avuto la possibilità di rispondere (la "seconda possibilità").

  • L'evento può anche inviare un messaggio al debugger, ma continuare l'esecuzione.

  • Il debugger può ignorare l'evento.

Il debugger può anche impostare lo stato di gestione per ogni eccezione e evento. Il debugger può trattare l'evento come un'eccezione gestita o un'eccezione non gestita. Naturalmente, gli eventi che non sono effettivamente errori non richiedono alcuna gestione.

È possibile controllare lo stato di interruzione e gestire lo stato eseguendo una delle operazioni seguenti:

  • Usare il comando SXE, SXD, SXN o SXI nella finestra Di comando del debugger.

  • (CDB e NTSD) Usare l'opzione -x, -xe, -xd, -xn o -xi nella riga di comando.

  • (CDB, NTSD e KD) Usare la parola chiave sxe o sxd nel file Tools.ini .

  • (solo WinDbg) Selezionare Filtri eventi dal menu Debug per aprire la finestra di dialogo Filtri eventi e quindi scegliere le opzioni desiderate.

Il comando SX\*, l'opzione della riga di comando -x\* e la parola chiave sx\* Tools.ini in genere impostano lo stato di interruzione dell'evento specificato. È possibile aggiungere l'opzione -h per impostare invece lo stato di gestione.

Esistono quattro codici evento speciali (cc, hc, bpec e ssec) che specificano sempre lo stato di gestione anziché lo stato di interruzione.

È possibile visualizzare l'eccezione o l'evento più recente usando il comando .lastevent (Display Last Event).

Controllo dello stato di interruzione

Quando si imposta lo stato di interruzione di un'eccezione o di un evento, è possibile usare le opzioni seguenti.

Comando Nome dello stato Descrizione

SXE o -xe

interruzione

(Abilitato)

Quando si verifica questa eccezione, la destinazione passa immediatamente al debugger. Questa interruzione si verifica prima dell'attivazione di qualsiasi altro gestore di errore. Questo metodo è denominato first-chance handling.

SXD o -xd

Pausa per una seconda possibilità

(Disabilitato)

Il debugger non si attiva per questo tipo di eccezione "first-chance" (anche se viene visualizzato un messaggio). Se altri gestori di errori non possono risolvere questa eccezione, l'esecuzione si arresta e la destinazione entra nel debugger. Questo metodo è denominato second-chance handling.

SXN o -xn

Output

(Notifica)

Quando si verifica questa eccezione, l'applicazione di destinazione non si interrompe affatto nel debugger. Viene tuttavia visualizzato un messaggio che informa l'utente di questa eccezione.

SXI o -xi

Ignora

Quando si verifica questa eccezione, l'applicazione di destinazione non si interrompe nel debugger e non viene visualizzato alcun messaggio.

Se un'eccezione non è prevista da un'impostazione SX*, l'applicazione di destinazione si interrompe nel debugger al secondo tentativo. Lo stato predefinito per gli eventi è elencato nella sezione "Definizioni eventi e impostazioni predefinite" di questo argomento.

Per impostare lo stato di interruzione usando l'interfaccia grafica WinDbg, Filtri eventi nel menu Debug selezionare l'evento desiderato dall'elenco nella finestra di dialogo Filtri eventi e quindi selezionare Abilitato, Disabilitato, Output o Ignora.

Controllo dello stato di gestione

Tutti gli eventi vengono considerati non gestiti, a meno che non si usi il comando gh (Go with Exception Handled).

Tutte le eccezioni vengono considerate non gestite, a meno che non si usi il comando sx\* insieme all'opzione -h .

Inoltre, le opzioni SX* possono configurare lo stato di gestione per handle non validi, istruzioni di interruzione STATUS_BREAKPOINT ed eccezioni a passo singolo. Questa configurazione è separata dalla relativa configurazione di interruzione. Quando si configura lo stato di interruzione, questi eventi sono denominati rispettivamente ch, bpe e sse. Quando si configura lo stato di gestione, questi eventi sono denominati rispettivamente hc, bpec e ssec. Per l'elenco completo degli eventi, vedere la sezione "Definizioni di eventi e impostazioni predefinite" seguente.

È possibile configurare lo stato di gestione per l'evento CTRL+C (cc), ma non lo stato di interruzione. Se un'applicazione riceve un evento CTRL+C, l'applicazione si interrompe sempre nel debugger.

Quando si usa il comando SX* negli eventi cc, hc, bpec e ssec oppure quando si usa il comando SX* insieme all'opzione -h in un'eccezione, si verificano le azioni seguenti.

Comando Nome dello stato Descrizione

SXE

Gestito

L'evento viene considerato gestito quando l'esecuzione riprende.

SXD, SXN, SXI

Non gestito

L'evento è considerato non gestito quando l'esecuzione riprende.

Per impostare lo stato di gestione tramite l'interfaccia grafica WinDbg, selezionare Filtri eventi dal menu Debug , selezionare l'evento desiderato dall'elenco nella finestra di dialogo Filtri eventi e quindi selezionare Handled o Not Handled.

Comandi automatici

Il debugger consente inoltre di impostare i comandi che vengono eseguiti automaticamente se l'evento o l'eccezione causa un'interruzione nel debugger. È possibile impostare una stringa di comando per l'interruzione first-chance e una stringa di comando per l'interruzione second-chance. È possibile impostare queste stringhe con il comando SX\* o Debug | Comando Filtri eventi . Ogni stringa di comando può contenere più comandi separati da punti e virgola.

Questi comandi vengono eseguiti indipendentemente dallo stato di interruzione. Ovvero, se lo stato dell'interruzione è "Ignora", il comando viene comunque eseguito. Se lo stato dell'interruzione è "Second-chance break", il comando first-chance viene eseguito quando l'eccezione si verifica per la prima volta, prima che vengano coinvolti altri gestori di eccezioni. La stringa di comando può terminare con un comando di esecuzione, ad esempio g (Go), gh (Go with Exception Handled), o gn (Go with Exception Not Handled).

Definizioni di eventi e impostazioni predefinite

È possibile modificare lo stato di interruzione o gestire lo stato delle eccezioni seguenti. Il relativo stato di interruzione predefinito è indicato.

Lo stato di gestione predefinito delle eccezioni seguenti è sempre "Non gestito". Prestare attenzione a modificare questo stato. Se si imposta questo stato su "Gestito", tutte le eccezioni first-chance e second-chance di questo tipo vengono considerate gestite e questa configurazione ignora tutte le routine di gestione delle eccezioni.

Codice evento Significato Stato di interruzione predefinito

asrt

Errore di asserzione

Pausa

Av

Violazione di accesso

Pausa

decimetro

Dati non allineati

Pausa

Dz

Divisione di numeri interi per zero

Pausa

c000008e

Divisione a virgola mobile per zero

Pausa

eh

Eccezione EH C++

Opportunità di riscatto

Gp

Violazione della pagina di protezione

Pausa

ii

Istruzione non valida

Opportunità di riscatto

iov

Overflow intero

Pausa

ip

Errore di I/O nella pagina

Pausa

Isc

Chiamata di sistema non valida

Pausa

lsq

Sequenza di blocco non valida

Pausa

sbo

Overflow del buffer dello stack

Pausa

Sov

Overflow dello stack

Pausa

wkd

Debugger di riattivazione

Pausa

Aph

Blocco dell'applicazione

Questa eccezione viene attivata se il sistema operativo Windows conclude che un processo ha smesso di rispondere (ovvero, è bloccato).

Pausa

3c

Terminazione dell'applicazione secondaria

Opportunità di riscatto

Ch
Hc

Handle non valido

Pausa

Numero

Qualsiasi eccezione numerata

Opportunità di riscatto

Nota È possibile eseguire l'override dello stato di interruzione asrt per un indirizzo specifico usando il comando ah (Assertion Handling). I codici evento ch e hc fanno riferimento alla stessa eccezione. Quando controlli lo stato di interruzione, usa sx* ch. Quando si controlla lo stato di gestione, usare sx* hc.

È possibile modificare lo stato di interruzione o gestire lo stato delle eccezioni seguenti. Il relativo stato di interruzione predefinito è indicato.

Lo stato di gestione predefinito delle eccezioni seguenti è sempre "Gestito". Poiché queste eccezioni vengono usate per comunicare con il debugger, in genere non è consigliabile cambiarne lo stato in "Non gestito". Questo stato fa sì che altri gestori di eccezioni intercettano le eccezioni se il debugger li ignora.

Un'applicazione può usare DBG_COMMAND_EXCEPTION (dbce) per comunicare con il debugger. Questa eccezione è simile a un punto di interruzione, ma è possibile usare il comando SX* per reagire in modo specifico quando si verifica questa eccezione.

Codice evento Significato Stato di interruzione predefinito

dbce

Eccezione speciale del comando del debugger

Ignora

vcpp

Eccezione speciale di Visual C++

Ignora

wos

Eccezione a passaggio singolo WOW64

Pausa

wob

Eccezione del punto di interruzione WOW64-

Pausa

Sse
ssec

Eccezione in un unico passaggio

Pausa

bpe
bpec

Eccezione del punto di interruzione

Pausa

cce
Cc

CTRL+C o CTRL+BREAK

Questa eccezione viene attivata se il bersaglio è un'applicazione console e viene passato CTRL+C o CTRL+BREAK.

Pausa

Nota Le tre eccezioni finali nella tabella precedente hanno due codici evento diversi. Quando si controlla lo stato di interruzione, usare sse, bpe e cce. Quando si controlla lo stato di gestione, usare ssec, bpec e cc.

Le eccezioni seguenti sono utili quando si esegue il debug di codice gestito.

Codice evento Significato Stato predefinito

Clr

Eccezione di Common Language Runtime

Opportunità di riscatto

Non gestito

clrn

Eccezione di notifica di Common Language Runtime

Opportunità di riscatto

Gestito

È possibile modificare lo stato di interruzione degli eventi seguenti. Poiché questi eventi non sono eccezioni, lo stato di gestione è irrilevante.

Codice evento Significato Stato di interruzione predefinito

Ser

Errore di sistema

Ignora

cpr[:Process]

Creazione del processo

L'impostazione dello stato di interruzione di questo evento si applica solo al debug in modalità utente. Questo evento non si verifica in modalità kernel.

È possibile controllare questo evento solo se è stato attivato il debug dei processi figli in CDB o WinDbg, tramite l'opzione della riga di comando -o o tramite il comando .childdbg (Debug dei Processi Figli).

Il nome del processo può includere un'estensione di file facoltativa e utilizzare un asterisco () o un punto interrogativo (?) come caratteri jolly. Il debugger memorizza solo l'impostazione cpr più recente. Le impostazioni separate per i processi separati non sono supportate. Includere due punti o uno spazio tra cpr e Process.

Se Process viene omesso, l'impostazione si applica a qualsiasi creazione di processi figlio.

Ignora

epr[:Process]

Uscita del processo

L'impostazione dello stato di interruzione di questo evento si applica solo al debug in modalità utente. Questo evento non si verifica in modalità kernel.

È possibile controllare questo evento solo se è stato attivato il debug dei processi figli in CDB o WinDbg, tramite l'opzione della riga di comando -o o tramite il comando .childdbg (Debug dei Processi Figli).

Il nome del processo può includere un'estensione di file facoltativa e utilizzare un asterisco () o un punto interrogativo (?) come caratteri jolly. Il debugger memorizza solo l'impostazione epr più recente. Le impostazioni separate per i processi separati non sono supportate. Includere due punti o uno spazio tra epr e Process.

Se Process viene omesso, l'impostazione si applica a qualsiasi terminazione di un processo figlio.

Ignora

Ct

Creazione thread

Ignora

et

Uscita del thread

Ignora

ld[:Module]

Caricare il modulo

Se si specifica Module, l'interruzione si verifica quando viene caricato il modulo con questo nome. Il modulo può specificare il nome o l'indirizzo del modulo. Se viene usato il nome, Module potrebbe contenere un'ampia gamma di caratteri jolly e identificatori. Per altre informazioni sulla sintassi, vedere Sintassi di stringhe con caratteri jolly.

Il debugger memorizza solo l'impostazione ld più recente. Le impostazioni separate per i moduli separati non sono supportate. Includi due punti o uno spazio tra ld e Modulo.

Se Module viene omesso, l'evento viene attivato quando viene caricato un modulo.

Risultato

ud[:Module]

Scaricare il modulo

Se si specifica Module, l'interruzione si verifica quando il modulo con questo nome o in questo indirizzo di base viene scaricato. Il modulo può specificare il nome o l'indirizzo del modulo. Se il nome viene utilizzato, Module può essere un nome esatto o includere caratteri jolly. Se Module è un nome esatto, viene immediatamente risolto in un indirizzo di base usando l'elenco di moduli del debugger corrente e viene archiviato come indirizzo. Se Module contiene caratteri jolly, la stringa del criterio viene mantenuta per la corrispondenza successiva quando si verificano eventi di scaricamento.

Raramente, il debugger non dispone di informazioni sul nome per scaricare gli eventi e corrisponde solo all'indirizzo di base. Pertanto, se Module contiene caratteri jolly, il debugger non può eseguire una corrispondenza del nome in questo particolare caso di scaricamento e si interrompe quando qualsiasi modulo viene scaricato.

Il debugger memorizza solo l'impostazione definita dall'utente più recente. Le impostazioni separate per i moduli separati non sono supportate. Includere due punti o uno spazio tra ud e Module.

Se Module viene omesso, l'evento viene attivato quando viene caricato un modulo.

Risultato

out[:Output]

Output dell'applicazione di destinazione

Se si specifica Output, l'interruzione si verifica solo quando viene ricevuto l'output corrispondente al modello specificato. L'output può contenere un'ampia gamma di caratteri jolly e identificatori. Per altre informazioni sulla sintassi, vedere Sintassi stringhe con caratteri jolly. Tuttavia, Output non può contenere due punti o spazi. La corrispondenza non fa distinzione tra maiuscole e minuscole. Includere due punti o uno spazio tra out e Output.

Ignora

ibp

Punto di interruzione iniziale

Questo evento si verifica all'inizio della sessione di debug e dopo il riavvio del computer di destinazione.

In modalità utente: Interrompere. È possibile modificare questo stato in "Ignora" usando l'opzione della riga di comando-g.

In modalità kernel: Ignorare. È possibile modificare questo stato impostandolo su "Abilitato" in base a diversi metodi. Per altre informazioni su come modificare questo stato, vedere Arresto anomalo e riavvio del computer di destinazione.

iml

Caricamento iniziale del modulo

(solo modalità kernel)

Ignorare. È possibile modificare questo stato impostandolo su "Interrompi" in base a diversi metodi. Per altre informazioni su come modificare questo stato, vedere Arresto anomalo e riavvio del computer di destinazione.