Causing Gtk to abort on assert
I have to debug a program which is heavily dependent on Gtk. The issue is that for some reason a lot of runtime warnings have started appearing when working with GtkWindow
objects. The problem is, even though Gtk complains of critical errors, it does not abort on these errors. I don't have the change history for the code base so my only option seems to be to wade though all gtk calls which seem suspect and see where the problem is. If however, I can somehow cause Gtk to abort on this error, I can run it with gdb and try to get the backtrace and locate the exact position of the error. Any idea how this can be done?
GLib-GObject-WARNING **: invalid uninstantiatable type `<invalid>' in cast to `GObject'
GLib-GObject-CRITICAL **: g_object_get_data: assertion `G_IS_OBJECT (object)' failed
GLib-GObject-WARNING **: invalid uninstantiatable type `<invalid>' in cast to `GObject'
GLib-GObject-CRITICAL **: g_object_get_data: assertion `G_IS_OBJECT (object)' failed
GLib-GObject-WARNING **: invalid uninstantiatable type `<invalid>' in cast to `GObject'
GLib-GO开发者_Python百科bject-CRITICAL **: g_object_get_data: assertion `G_IS_OBJECT (object)' failed
I am collecting the methods Matt mentioned and the one I found out to provide the complete answer here. I will mark it as the chosen answer and up-vote Matt's answer.
Three ways to force gtk to agort on error:
G_DEBUG=fatal_warnings ./myprog ...
./myprog -prog-args --g-fatal-warnings
- Use g_log_set_handler, and/or g_log_default_handler and provide a GLogFunc of your own design that aborts based on the GLogLevelFlags passed to it for each message.
I should also mention g_log_set_always_fatal(G_LOG_LEVEL_CRITICAL|G_LOG_LEVEL_WARNING);
to make the list complete even though "always fatal" is not what I was looking for.
Use g_log_set_handler
, and/or g_log_default_handler
and provide a GLogFunc
of your own design that aborts based on the GLogLevelFlags
passed to it for each message.
void abort_on_g_log(
const gchar *log_domain,
GLogLevelFlags log_level,
const gchar *message,
gpointer user_data)
{
if (log_level & G_LOG_LEVEL_CRITICAL) abort();
g_log_default_handler(log_domain, log_level, message, user_data);
}
Update0
If you're happy having glib terminate for you, you can use:
g_log_set_always_fatal(G_LOG_LEVEL_CRITICAL|G_LOG_LEVEL_WARNING);
or run with G_DEBUG=fatal_warnings ./myprog ...
if glib is correctly configured, see here for more.
精彩评论