glib为类型x_get_instance_private()
生成宏x
。
使用gdb
进行调试时,我无法调用宏。
如何查看实例私有数据?我正在调试的函数确实获取实例私有数据,但保存它的变量是<optimized out>
。
答案 0 :(得分:2)
使用gdb进行调试时,我无法调用宏。
请注意,如果使用-g3
进行编译,则gcc会将宏体放入调试信息中,gdb将允许您在表达式中使用它们。
那就是说,gdb只能理解&#34;表达式&#34; C的子集 - 所以如果宏引入新的范围或做其他非平凡的事情,那么它就不会起作用。
答案 1 :(得分:2)
您可以使用g_type_class_get_instance_private_offset
。
基于sourcejedi答案,对于NMManager(NetworkManager):
(gdb) p *( (NMManagerPrivate *) ((char *) manager
+ g_type_class_get_instance_private_offset(
((GTypeInstance *)manager)->g_class )))
当private不在对象之前时,这是有效的。检查 NMManager的布局不是标准GObject。
答案 2 :(得分:1)
GsShell
(gnome-software)的示例。我有GObject
名为object
。我通过实验发现:私人数据存储在GObject
之前。
(gdb) p *( (*GsShellPrivate) ((char *) object - sizeof(GsShellPrivate)) )