2011-04-26 13 views
21

Da qualche parte in una massa di codice che non ho scritto (ma sto cercando di debug), un'asserzione fallisce nella libreria GLib:In che modo si interrompe GDB in caso di errore di asserzione GLib?

(process:31987): GLib-CRITICAL **: g_hash_table_lookup: assertion `hash_table != NULL' failed 

Tuttavia, GDB e il codice continua ad andare. Vorrei che GDB interrompesse il punto in cui questa asserzione fallisce, così che io possa scoprire perché sta fallendo. Non mi vengono date ulteriori informazioni su dove sia questa affermazione. C'è un modo per far sì che GDB si rompa in un simile fallimento?

+0

duplicati di: http://stackoverflow.com/questions/2450001/how-can-i -find-out-where-is-my-code-causing-glib-gobject-critical, ma questa domanda è più chiara, quindi voterò per chiudere l'altra. – ptomato

risposta

17

Pausa su g_log(). Questo riguarda tutti i casi come g_warning(), g_critical(), ecc

+9

Gli utili comandi gdb sono: 'break g_log if log_level == G_LOG_LEVEL_CRITICAL' e' break g_log if log_level == G_LOG_LEVEL_WARNING' – Mildred

20

Si dovrebbe aggiungere una variabile d'ambiente come questo:

G_DEBUG=fatal_warnings gdb ... 
+1

per errori, G_DEBUG = errori fatali è sufficiente – daf

+2

'G_DEBUG = fatal-errors' non funziona per me , ma 'G_DEBUG = fatal-warnings' e' G_DEBUG = fatal-criticals' è, controlla anche [resto delle opzioni] (https://developer.gnome.org/glib/stable/glib-running.html#G- DEBUG: CAPS). La riga per gdb potrebbe essere 'gdb --args PROGRAM ARG1 ARG2' e quindi all'interno di gdb emettere i comandi:' set env G_DEBUG = fatal-criticals' e quindi 'run' – Nelson

Problemi correlati