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

Debugging 如何找到使用gdb定义的文件?,debugging,path,gdb,Debugging,Path,Gdb,当我在gdb中键入list mystruct时,我会收到用于定义mystruct的代码行。我怎样才能让gdb给我它正在读取的文件来打印这些行呢?最好从gdb python接口获取该文件。越容易分析越好 谢谢 为了显示类型的定义,有一个命令ptype: $ ptype mystruct ... $ info types ^mystruct$ <filename>:<line> $ list myfile.c:100,myfile.c:110 要了解类型的定义位置,请使

当我在gdb中键入
list mystruct
时,我会收到用于定义mystruct的代码行。我怎样才能让gdb给我它正在读取的文件来打印这些行呢?最好从gdb python接口获取该文件。越容易分析越好


谢谢

为了显示类型的定义,有一个命令ptype

$ ptype mystruct
...
$ info types ^mystruct$
<filename>:<line>
$ list myfile.c:100,myfile.c:110
要了解类型的定义位置,请使用命令info types regex:

$ ptype mystruct
...
$ info types ^mystruct$
<filename>:<line>
$ list myfile.c:100,myfile.c:110
如果不够的话

$ list +
请注意,可能存在多个相同的类型定义,因此信息类型可以给出多个位置

更新

由于这是编译器(生成调试信息,例如DWARF)和读取调试信息的gdb(例如DWARF)之间的兼容性问题,出于某种原因,并不总是能够检索详细信息,例如行号。这可以通过使用特定的工具来解决,例如,对于DWARF,有一个工具可以访问文件中的所有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
$dwarfdump-ie./a.out
... 
<1>结构类型
名称“mystruct”
字节大小0x0000000c
decl_文件0x00000002../sample.h
decl_行0x00000003
兄弟姐妹
<2>成员
名字“我”
decl_文件0x00000002../sample.h
decl_行0x00000004
类型
数据\成员\位置0
<2>成员
名称“少”
decl_文件0x00000002../sample.h
decl_行0x00000005
类型
数据\成员\位置4
这里不仅有类型声明开始的行信息,还有每个成员的行号信息


输出格式不是很方便,而且很重-您应该编写自己的解析器。但是最好使用python编写自己的工具,或者在python上使用。是示例之一。

如果您使用调试信息(-g3)选项编译,
您可以使用:
info宏mystruct

e、 g
info宏存储原始数据

(gdb)信息宏存储单元原始

在/usr/include/x86\u 64-linux-gnu/bits/socket\u 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



``

第二个命令与我要查找的命令类似;但是,当我尝试使用它时,它只给出:“所有匹配正则表达式“^mystruct$”的类型:”“正则表达式似乎不匹配。不过,我意识到删除“^mystruct$”周围的引号是有效的。您的响应列出了文件名和行号,但gdb只给了我文件名。有什么额外的事情可以让它打印出行号吗?@Matt检查我的更新,我玩gcc/gdb,无法看到行号,即使它们存储在dwarf文件中,需要深入gdb源代码为什么。。。但是既然你提到了python,pyelftools就是你的选择……我唯一关心的是使用像dwarfdump pyelftools这样的工具,dwarf不是调试符号格式。如果可执行文件是用STAB或其他格式编译的,这些工具是否有效?@Matt STAB和DWARF都是调试数据格式。STAB非常古老,支撑力有限,因此DWARF得到了更广泛的应用。编译器以哪种格式生成调试数据?(您可以使用readelf检查二进制文件是否有.stab部分或.debug_xxx部分)