当我在gdb中输入list mystruct
时,我会收到用于定义mystruct的代码行。如何让gdb给我正在读取的文件来打印这些行?从gdb python接口获取该文件将是更可取的。越容易解析越好。
谢谢!
答案 0 :(得分:2)
为了显示类型的定义,有一个命令 ptype :
$ ptype mystruct
...
要知道何处定义类型,请命令信息类型正则表达式 :
$ info types ^mystruct$
<filename>:<line>
要打印源文件行,请执行命令 list filename:start_line,filename:end_line :
$ list myfile.c:100,myfile.c:110
如果还不够
$ list +
请注意,可能存在多种相同类型的定义,因此信息类型可以提供多个位置。
<强>更新强>
由于这是编译器(生成调试信息,例如DWARF)和读取它的 gdb 之间的兼容性问题,出于某种原因,并不总是能够检索详细信息,例如电话号码。这可以通过使用特定工具来解决,例如:对于DWARF,有一个 dwarfdump 工具,可以访问文件中的所有DWARF信息。结构类型的输出
struct mystruct {
int i;
struct sample *less;
}
看起来像:
$ dwarfdump -ie ./a.out
...
< 1><0x00000079> structure_type
name "mystruct"
byte_size 0x0000000c
decl_file 0x00000002 ../sample.h
decl_line 0x00000003
sibling <0x000000a8>
< 2><0x00000085> member
name "i"
decl_file 0x00000002 ../sample.h
decl_line 0x00000004
type <0x0000004f>
data_member_location 0
< 2><0x0000008f> member
name "less"
decl_file 0x00000002 ../sample.h
decl_line 0x00000005
type <0x000000a8>
data_member_location 4
在这里,您可以了解不仅类型声明开始的行,还有每个成员的行号。
输出格式不是很方便,而且很重 - 你应该编写自己的解析器。但是使用libdwarf编写自己的工具或在python上使用pyelftools可能会更好。 Here就是其中一个例子。
答案 1 :(得分:0)
如果您已使用调试信息(-g3)选项进行了编译,
您可以使用:
info macro mystruct
例如
info macro SOCK_RAW
(gdb)信息宏SOCK_RAW
Defined at /usr/include/x86_64-linux-gnu/bits/socket_type.h:33
包含在/usr/include/x86_64-linux-gnu/bits/socket.h:38
包含在/usr/include/x86_64-linux-gnu/sys/socket.h:38
包含在/home/nirl/cpp_tut/filter/filter.cpp:1
``