在gdb调试器中使用* _get_instance_private()宏

时间:2016-10-09 16:41:07

标签: gdb glib

glib为类型x_get_instance_private()生成宏x

使用gdb进行调试时,我无法调用宏。

如何查看实例私有数据?我正在调试的函数确实获取实例私有数据,但保存它的变量是<optimized out>

3 个答案:

答案 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)) )