Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Causing Gtk to abort on assert

Tags:

c

warnings

gdb

gtk

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-GObject-CRITICAL **: g_object_get_data: assertion `G_IS_OBJECT (object)' failed
like image 272
341008 Avatar asked Jan 10 '11 11:01

341008


2 Answers

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:

  1. G_DEBUG=fatal_warnings ./myprog ...
  2. ./myprog -prog-args --g-fatal-warnings
  3. 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.

like image 197
341008 Avatar answered Sep 30 '22 05:09

341008


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.

like image 26
Matt Joiner Avatar answered Sep 30 '22 06:09

Matt Joiner