如何在gdb中加载多个符号文件

如何在gdb加载多个符号文件。 我有一个可执行文件foo.out并加载模块bar.so. 我创建了两个符号文件foo.symbol和bar.symbol。 如何将这两个文件加载到gdb中。

 # gdb --core core # (gdb) # (gdb) symbol-file foo.symbol 

如何加载第二个符号文件。 或者有没有办法在gdb加载目录的所有文件

设置包含符号文件的目录

 set debug-file-directory  

并使用

 show debug-file-directory 

显示当前设置为包含符号文件的目录。

如果符号文件的名称(无路径)由二进制文件根据调试链接提供,则从该目录自动读取符号文件。


要添加附加符号,您可以使用add-symbol-file

(因为gdb onlinedocs目前似乎不可用,我在这里引用它)

add-symbol-file文件名地址

add-symbol-file filename address [-readnow] [-mapped]

add-symbol-file filename -ssection address …

add-symbol-file命令从文件filename中读取其他符号表信息。 当文件名已经(通过其他方式)动态加载到正在运行的程序中时,您将使用此命令。 address应该是加载文件的内存地址; gdb无法解决这个问题。 您还可以指定任意数量的`-ssection地址’对,以给出该部分的显式部分名称和基址。 您可以将任何地址指定为表达式。

文件filename的符号表将添加到最初使用symbol-file命令读取的符号表中。 您可以多次使用add-symbol-file命令; 这样读取的新符号数据不断增加旧的符号数据。 要丢弃所有旧符号数据,请使用不带任何参数的symbol-file命令。

尽管filename通常是共享库文件,可执行文件或其他已完全重定位以加载到进程中的目标文件,但您也可以从可重定位的.o文件中加载符号信息,只要:

  • 文件的符号信息仅指该文件中定义的链接器符号,而不是其他目标文件定义的符号,
  • 文件的符号信息所引用的每个部分实际上已经加载到下级,因为它出现在文件中,并且
  • 您可以确定加载每个部分的地址,并将这些部分提供给add-symbol-file命令。

一些嵌入式操作系统,如Sun Chorus和VxWorks,可以将可重定位文件加载到已经运行的程序中; 这样的系统通常使上述要求容易满足。 但是,重要的是要认识到许多本机系统使用复杂的链接过程(例如,.linkonce section factoring和C ++构造函数表程序集),这使得需求难以满足。 通常,不能假设使用add-symbol-file来读取可重定位目标文件的符号信息将具有与以正常方式将可重定位目标文件链接到程序中相同的效果。

如果在使用后按下,则不会重复添加符号文件。

您可以像使用symbol-file命令一样使用-mapped' and -readnow’选项来更改gdb管理filename的符号表信息的方式。

除了alk的答案及其评论之外,所要求的地址是.text部分的地址。 您可以使用readelf命令找到它

这里有一个readelf用于二进制文件的示例缺少文件名的地址[GDB]

我没有尝试手动将符号加载到正确的位置,而是发现使用eu-unstrip 将符号合并回剥离的可执行文件更方便,然后使用已存在的符号重现崩溃。

此方法不依赖于符合设置debug-file-directory时使用的路径解析机制( 调试链接构建ID )所需的命名方案的符号文件。

 add-symbol-file filename address add-symbol-file filename address [ -readnow ] [ -mapped ] add-symbol-file filename -ssection address ... 

请参阅http://www.delorie.com/gnu/docs/gdb/gdb_125.html