导致Gtk中断断言

341*_*008 7 c gtk warnings gdb

我必须调试一个严重依赖于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
Run Code Online (Sandbox Code Playgroud)

341*_*008 14

我正在收集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而中止.

我还应该提一下g_log_set_always_fatal(G_LOG_LEVEL_CRITICAL|G_LOG_LEVEL_WARNING);,尽管"总是致命的"不是我想要的,但是要使列表完整.


Mat*_*ner 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);
}
Run Code Online (Sandbox Code Playgroud)

Update0

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

g_log_set_always_fatal(G_LOG_LEVEL_CRITICAL|G_LOG_LEVEL_WARNING);
Run Code Online (Sandbox Code Playgroud)

或者G_DEBUG=fatal_warnings ./myprog ...如果正确配置了glib,请运行,请参阅此处了解更多信息.