导致Gtk中断断言

时间:2011-01-10 11:53:51

标签: c gtk gdb warnings

我必须调试一个严重依赖Gtk的程序。问题在于,由于某些原因,在使用GtkWindow对象时已经开始出现许多运行时警告。问题是,即使Gtk抱怨严重错误,它也不会中止这些错误。我没有代码库的更改历史记录,所以我唯一的选择似乎是涉及所有似乎可疑的gtk调用并查看问题所在。但是,如果我可以以某种方式导致Gtk中止此错误,我可以使用gdb运行它并尝试获取回溯并找到错误的确切位置。知道如何做到这一点?

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

2 个答案:

答案 0 :(得分:14)

我正在收集Matt提到的方法和我发现的方法,以提供完整的答案。我会将其标记为选择的答案并向Matt的答案进行投票。

强制gtk在出错时强行调整的三种方法:

  1. G_DEBUG=fatal_warnings ./myprog ...
  2. ./myprog -prog-args --g-fatal-warnings
  3. 使用g_log_set_handler和/或g_log_default_handler并提供您自己设计的GLogFunc,该GLogFunc基于为每条消息传递给它的GLogLevelFlags而中止。
  4. 我还应该提到g_log_set_always_fatal(G_LOG_LEVEL_CRITICAL|G_LOG_LEVEL_WARNING);以使列表完整,即使“总是致命的”不是我想要的。

答案 1 :(得分:5)

使用g_log_set_handler和/或g_log_default_handler并提供您自己设计的GLogFunc,根据每条消息传递给它的GLogLevelFlags进行中止。

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

如果你很高兴glib终止你,你可以使用:

g_log_set_always_fatal(G_LOG_LEVEL_CRITICAL|G_LOG_LEVEL_WARNING);
如果正确配置了glib,请

或使用G_DEBUG=fatal_warnings ./myprog ...运行,有关详情,请参阅here