Sto tentando di catturare affermazioni fallite nel mio programma. Sto usando una libreria che effettua chiamate dirette ad assert(), piuttosto che una funzione o una macro personalizzata, ed è all'interno di questa libreria che sto attualmente cercando di rintracciare diversi bug relativi al porting. Tutto ciò che è coinvolto è stato compilato con i simboli di debug in g ++.Qual è il modo corretto per interrompere affermazioni non riuscite in gdb?
La soluzione migliore che ho trovato è quella di infrangere il file: linea dell'asserzione, con la condizione dell'espressione assert. Questo permette di fermarsi prima che fallisca, ma è una soluzione orribile. Richiede una configurazione speciale per ogni affermazione che potrebbe non riuscire, non funzionerà dal mio IDE, ed è di gran lunga troppo impegnativo in generale.
Come posso rompere il qualsiasi fallito assert usando gdb & gcc in modo tale che consente l'esame della stack e le variabili nell'ambito di applicazione della chiamata assert?
Sarebbe ancora meglio se la soluzione mi permettesse di scartare il fallimento dell'assert e continuare a correre.
Su Windows in Visual Studio, interrompere è il comportamento predefinito di un 'assert' non riuscito. Sono sorpreso che non sia il caso del mondo * nix - cosa fa normalmente un "assert" fallito? – Angew
In gdb, prima dell'esecuzione del programma, è possibile usare 'break abort' (o semplicemente' b abort') per aggiungere un breakpoint alla funzione abort(). Ciò consentirà almeno di fare un backtrace quando un'asserzione fallisce (assumendo che richiami 'abort()' quando lo fa, alcune implementazioni possono chiamare 'exit()' invece). Non sono sicuro di continuare l'esecuzione però. – notmyfriend
Normalmente questo funziona di default, come le chiamate assert() abort, e abort alza il segnale SIGABRT, e gdb per default interruzioni su quel segnale, consentendo di ispezionare lo stack, spostare su/giù la pila, ad es. alla tua funzione contenente l'assert() e controlla le variabili e così via. – nos