如何在gdb
中加载多个符号文件。我有一个可执行的foo.out并加载了一个模块bar.so。我已经创建了两个符号文件foo.symbol和bar.symbol。如何将这两个文件加载到gdb中。
# gdb --core core
# (gdb)
# (gdb) symbol-file foo.symbol
如何加载第二个符号文件。或者有没有办法加载gdb
目录下的所有文件?
发布于 2013-12-05 02:27:44
要设置包含符号文件的目录,请使用
set debug-file-directory <directory>
并使用
show debug-file-directory
以显示当前设置为包含符号文件的目录。
如果二进制文件以调试链接的形式提供了符号文件的名称(没有路径),则会自动从该目录中读取符号文件。
要添加其他符号,可以使用add-symbol-file
。
(因为我在这里引用的时候gdb onlinedocs似乎不可用)
添加符号文件文件名地址
添加-符号-文件文件名地址-readnow
添加符号文件文件名-ssection地址...
add- symbol -file命令从文件filename读取额外的符号表信息。当filename已动态加载(通过某种其他方式)到正在运行的程序中时,您可以使用此命令。address应该是加载文件的内存地址;gdb自己无法确定这一点。您还可以指定任意数量的“-ssection address”对,以给出该节的显式节名和基地址。您可以将任何地址指定为表达式。
文件文件名的符号表被添加到最初使用symbol-file命令读取的符号表中。您可以使用add- symbol -file命令任意次数;这样读取的新符号数据会一直与旧符号数据相加。要丢弃所有旧的符号数据,请使用不带任何参数的symbol-file命令。
尽管filename通常是共享库文件、可执行文件或已完全重新定位以加载到进程中的某些其他目标文件,但您也可以从可重新定位的.o文件加载符号信息,只要:
-
一些嵌入式操作系统,如Sun Chorus和VxWorks,可以将可重定位的文件加载到已经运行的程序中;这样的系统通常很容易满足上述要求。但是,重要的是要认识到,许多本机系统使用复杂的链接过程(例如,.linkonce段分解和C++构造函数表组装),这使得需求难以满足。一般来说,不能假设使用add-symbol-file读取可重定位目标文件的符号信息与以正常方式将可重定位目标文件链接到程序中具有相同的效果。
使用后按add-symbol-file不会重复。
您可以像使用-mapped' and
--readnow命令一样使用符号文件的选项来更改gdb管理文件名的符号表信息的方式。
发布于 2019-04-18 19:16:24
可以使用以下命令将其他符号加载到gdb
调试会话:
add-symbol-file filename address
其中,address
为.text
段的地址。可以使用以下命令检索此地址:
readelf -WS path/to/file.elf | grep .text | awk '{ print "0x"$5 }'
通过将以下条目添加到~/.gdbinit
,可以在gdb
中自动执行此操作
define add-symbol-file-auto
# Parse .text address to temp file
shell echo set \$text_address=$(readelf -WS $arg0 | grep .text | awk '{ print "0x"$5 }') >/tmp/temp_gdb_text_address.txt
# Source .text address
source /tmp/temp_gdb_text_address.txt
# Clean tempfile
shell rm -f /tmp/temp_gdb_text_address.txt
# Load symbol table
add-symbol-file $arg0 $text_address
end
在上面的函数定义之后,可以使用add-symbol-file-auto
加载额外的符号:
(gdb) add-symbol-file-auto path/to/bootloader.elf
add symbol table from file "path/to/bootloader.elf" at
.text_addr = 0x8010400
(gdb) add-symbol-file-auto path/to/application.elf
add symbol table from file "path/to/application.elf" at
.text_addr = 0x8000000
(gdb) break main
Breakpoint 1 at 0x8006cb0: main. (2 locations)
(gdb) info break
Num Type Disp Enb Address What
1 breakpoint keep y <MULTIPLE>
1.1 y 0x08006cb0 in main() at ./source/main.cpp:114
1.2 y 0x080106a6 in main() at ./main.cpp:10
(gdb)
发布于 2014-12-18 17:06:14
除了alk的回答和评论之外,询问的地址是.text
部分的地址。您可以使用readelf
命令找到它
这里有一个用于二进制文件The address where filename has been loaded is missing [GDB]的readelf
示例
https://stackoverflow.com/questions/20380204
复制相似问题