在 gdb 调试器中使用 *_get_instance_private() 宏
Use *_get_instance_private() macro in gdb debugger
glib 为类型 x
.
生成一个宏 x_get_instance_private()
使用gdb
调试时,无法调用宏。
如何查看实例私有数据?我正在调试的函数确实获取了实例私有数据,但是保存它的变量是 <optimized out>
.
GsShell
示例(gnome 软件)。我有一个名为 object
的 GObject
。我通过实验发现:私有数据存储在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。
glib 为类型 x
.
x_get_instance_private()
使用gdb
调试时,无法调用宏。
如何查看实例私有数据?我正在调试的函数确实获取了实例私有数据,但是保存它的变量是 <optimized out>
.
GsShell
示例(gnome 软件)。我有一个名为 object
的 GObject
。我通过实验发现:私有数据存储在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。