如何找到使用gdb定义的文件?

时间:2016-03-10 22:17:17

标签: debugging path gdb

当我在gdb中输入list mystruct时,我会收到用于定义mystruct的代码行。如何让gdb给我正在读取的文件来打印这些行?从gdb python接口获取该文件将是更可取的。越容易解析越好。

谢谢!

2 个答案:

答案 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

``