我必须调试一个严重依赖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
答案 0 :(得分:14)
我正在收集Matt提到的方法和我发现的方法,以提供完整的答案。我会将其标记为选择的答案并向Matt的答案进行投票。
强制gtk在出错时强行调整的三种方法:
G_DEBUG=fatal_warnings ./myprog ...
./myprog -prog-args --g-fatal-warnings
我还应该提到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);
}
如果你很高兴glib终止你,你可以使用:
g_log_set_always_fatal(G_LOG_LEVEL_CRITICAL|G_LOG_LEVEL_WARNING);
如果正确配置了glib,请或使用G_DEBUG=fatal_warnings ./myprog ...
运行,有关详情,请参阅here。