在gdb调试器中使用*\u get\u instance\u private()宏

在gdb调试器中使用*\u get\u instance\u private()宏,gdb,glib,Gdb,Glib,glib为typex生成一个宏x\u get\u instance\u private() 使用gdb进行调试时,我无法调用宏 如何查看实例私有数据?我正在调试的函数确实获得了实例私有数据,但是保存它的变量一直是例如GsShell(gnome软件)。我有一个名为对象的GObject。我通过实验发现:私有数据存储在GObject之前 (gdb)p*((*GsShellPrivate)((char*)对象-sizeof(GsShellPrivate))GsShell(gnome软件)的示例。我有一个

glib为type
x
生成一个宏
x\u get\u instance\u private()

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


如何查看实例私有数据?我正在调试的函数确实获得了实例私有数据,但是保存它的变量一直是
例如
GsShell
(gnome软件)。我有一个名为
对象的
GObject
。我通过实验发现:私有数据存储在
GObject
之前


(gdb)p*((*GsShellPrivate)((char*)对象-sizeof(GsShellPrivate))
GsShell
(gnome软件)的示例。我有一个名为
对象的
GObject
。我通过实验发现:私有数据存储在
GObject
之前

(gdb)p*((*gshellprivate)((char*)对象-sizeof(gshellprivate)))

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

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

这就是说,gdb只理解C的“表达式”子集——因此,如果宏引入了一个新的作用域或做了其他非平凡的事情,那么它将无法工作

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

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


这就是说,gdb只理解C的“表达式”子集——因此,如果宏引入了一个新的作用域或做了其他非平凡的事情,那么它就不会工作。

您可以使用
g\u type\u class\u get\u instance\u private\u offset

根据sourcejedi的回答,对于NMManager(NetworkManager):

当private不在对象的正前方时,此操作有效。检查
布局不是标准GObject的NMManager。

您可以使用
g\u type\u class\u get\u instance\u private\u offset

根据sourcejedi的回答,对于NMManager(NetworkManager):

当private不在对象的正前方时,此操作有效。检查
NMManager,其中布局不是标准的GObject。

AFAIK这对使用
G\u DEFINE\u type\u WITH\u PRIVATE
定义的任何类型都有保证。AFAIK这对使用
G\u DEFINE\u type\u WITH\u PRIVATE
定义的任何类型都有保证。
(gdb)  p *( (NMManagerPrivate *) ((char *) manager
              + g_type_class_get_instance_private_offset(
                          ((GTypeInstance *)manager)->g_class )))