如何显示结构在GDB中具有哪些字段?


70

ngx_http_variable_value_t在GDB(调试器)会话中遇到了一个结构(称为),我想打印它在控制台中具有的字段。

那可能吗?

Answers:


126

您可以使用GDB命令ptype打印出结构或类的定义。

另外,用于ptype /o打印结构中所有字段的偏移量和大小(例如pahole)。


6
这是正确的答案。例如“(gdb)ptype tm”“ type = struct tm {int tm_sec; int tm_min; int tm_hour; int tm_mday; int tm_mon; int tm_year; int tm_wday; int tm_yday; int tm_isdst; long tm_mmt;}; “
gaoithe

5
偏移量呢?
康拉德·迈耶

3
@ConradMeyer我将其用于偏移量:(gdb) p &((struct foo *)0)->member。拥有一些非骇客的东西会很好。
domen

@domen是的,那也是我的hack。还寻找一些非骇客的东西,可以更快地输入:-)。
康拉德·迈耶

5
@ConradMeyer把macro define offsetof(t, f) &((t *) 0)->f)~/.gdbinit。然后就可以使用了(gdb) p offsetof(struct foo, member)
domen's

61

如果您内置了调试符号,则应该只能打印该值:print variable或者print *variable它是指向结构的指针。


5
并且如果变量是通用指针,例如void *,则可以将其强制转换为必需的类型print ((MY_STRUCT *)variable),或获取结构的特定元素print ((MY_STRUCT *)variable->my_structure_element
Phil DD

20

set print pretty on

此选项还为给出换行符和缩进p *my_struct_pointer

你喜欢哪个:

要么:


7

除了使用命令行选项之外,您还可以使用图形调试器。我建议使用gdbgui,但是有很多。

屏幕截图

免责声明:我是gdbgui的开发人员


您正在使用哪些mi命令从gdb获取此信息?
锡南

如果您正在运行gdbgui,则可以查看代表gdbgui发送到gdb的所有命令。为此,请转到“设置”(齿轮图标),然后选中“打印控制台中所有已发送的命令,包括gdbgui自动发送的命令”复选框。否则,您可以检查源代码github.com/cs01/gdbgui
cs01



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.