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

Use *_get_instance_private() macro in gdb debugger

glib 为类型 x.

生成一个宏 x_get_instance_private()

使用gdb调试时,无法调用宏。

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

GsShell 示例(gnome 软件)。我有一个名为 objectGObject。我通过实验发现:私有数据存储在GObject.

之前

(gdb) p *( (*GsShellPrivate) ((char *) object - sizeof(GsShellPrivate)) )

When debugging using gdb, I cannot call macros.

请注意,如果您使用 -g3 进行编译,那么 gcc 会将宏体放入调试信息中,而 gdb 会让您在表达式中使用它们。

就是说,gdb 只理解 C 的 "expression" 子集——所以如果宏引入了一个新的范围或做了其他重要的事情,那么它就不会工作。

您可以使用 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 不在 object 之前时,这有效。签到 布局不是标准 GObject 的 NMManager。