导致Gtk中断断言

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

 GLib-GObject-WARNING **: invalid uninstantiatable type `' in cast to `GObject' GLib-GObject-CRITICAL **: g_object_get_data: assertion `G_IS_OBJECT (object)' failed GLib-GObject-WARNING **: invalid uninstantiatable type `' in cast to `GObject' GLib-GObject-CRITICAL **: g_object_get_data: assertion `G_IS_OBJECT (object)' failed GLib-GObject-WARNING **: invalid uninstantiatable type `' in cast to `GObject' GLib-GObject-CRITICAL **: g_object_get_data: assertion `G_IS_OBJECT (object)' failed 

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

三种方法强制gtk在出错时进行agort:

  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); 使列表完整,即使“总是致命的”不是我想要的。

使用g_log_set_handler和/或g_log_default_handler并提供您自己设计的GLogFunc ,该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); 

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