Puoi provare a utilizzare un "catchpoint" ( catch throw
) per arrestare il debugger nel punto in cui viene generata l'eccezione.
Il seguente estratto dal manuale gdb descrive la funzione catchpoint.
5.1.3 Impostazione dei punti di incontro
È possibile utilizzare i punti di incontro per arrestare il debugger per determinati tipi di eventi del programma, come le eccezioni C ++ o il caricamento di una libreria condivisa. Usa il comando catch per impostare un catchpoint.
evento di cattura
Fermati quando si verifica un evento . evento può essere uno dei seguenti:
evento tcatch
Impostare un punto di incontro abilitato solo per una sosta. Il punto di incontro viene automaticamente eliminato dopo la prima volta che l'evento viene rilevato.
Utilizzare il info break
comando per elencare i punti di cattura correnti.
Ci sono attualmente alcune limitazioni alla gestione delle eccezioni C ++ (catch throw e catch catch) in GDB:
Se chiami una funzione in modo interattivo, GDB normalmente ti restituisce il controllo quando la funzione ha terminato l'esecuzione. Se la chiamata solleva un'eccezione, tuttavia, la chiamata può bypassare il meccanismo che ti restituisce il controllo e causare l'interruzione del programma o semplicemente continuare a funzionare finché non raggiunge un punto di interruzione, cattura un segnale che GDB sta ascoltando o esce. Questo è il caso anche se si imposta un punto di incontro per l'eccezione; i punti di incontro sulle eccezioni sono disabilitati nelle chiamate interattive.
Non è possibile sollevare un'eccezione in modo interattivo.
Non è possibile installare un gestore di eccezioni in modo interattivo.
A volte catch non è il modo migliore per eseguire il debug della gestione delle eccezioni: se hai bisogno di sapere esattamente dove viene sollevata un'eccezione, è meglio fermarti prima che venga chiamato il gestore delle eccezioni, poiché in questo modo puoi vedere lo stack prima che avvenga qualsiasi svolgimento. Se invece imposti un punto di interruzione in un gestore di eccezioni, potrebbe non essere facile scoprire dove è stata sollevata l'eccezione.
Per interrompere appena prima che venga chiamato un gestore di eccezioni, è necessaria una certa conoscenza dell'implementazione. Nel caso di GNU C ++, le eccezioni vengono sollevate chiamando una funzione di libreria denominata __raise_exception che ha la seguente interfaccia ANSI C:
/* addr is where the exception identifier is stored.
id is the exception identifier. */
void __raise_exception (void **addr, void *id);
Per fare in modo che il debugger rilevi tutte le eccezioni prima che avvenga qualsiasi svolgimento dello stack, impostare un breakpoint su __raise_exception (vedere la sezione Breakpoints; watchpoints; ed eccezioni).
Con un punto di interruzione condizionale (vedere la sezione Condizioni di interruzione) che dipende dal valore di id, è possibile interrompere il programma quando viene sollevata un'eccezione specifica. È possibile utilizzare più punti di interruzione condizionali per interrompere il programma quando viene sollevata una qualsiasi di una serie di eccezioni.
handle SIGUSR1 pass noprint nostop