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在出错时进行调整:
G_DEBUG=fatal_warnings ./myprog ...
./myprog -prog-args --g-fatal-warnings
我还应该提一下g_log_set_always_fatal(G_LOG_LEVEL_CRITICAL|G_LOG_LEVEL_WARNING);
,尽管"总是致命的"不是我想要的,但是要使列表完整.
使用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)
如果你很高兴有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,请运行,请参阅此处了解更多信息.