如何在gdb
中加载多个符号文件。我有一个可执行的foo.out并加载了一个模块bar.so。我已经创建了两个符号文件foo.symbol和bar.symbol。如何将这两个文件加载到gdb中。
# gdb --core core
# (gdb)
# (gdb) symbol-file foo.symbol
如何加载第二个符号文件。或者有没有办法加载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
示例
发布于 2020-06-19 21:11:24
来自Jaakko's answer的add-symbol-file-auto
依赖于对外部文件的写入。如果无法读取或写入文件,这可能会导致问题。下面是一个使用GDB command defined in Python提供相同功能的实现。将此代码添加到您的.gdbinit
python
# Note: Replace "readelf" with path to binary if it is not in your PATH.
READELF_BINARY = 'readelf'
class AddSymbolFileAuto (gdb.Command):
"""Load symbols from FILE, assuming FILE has been dynamically loaded (auto-address).
Usage: add-symbol-file-auto FILE [-readnow | -readnever]
The necessary starting address of the file's text is resolved by 'readelf'."""
def __init__(self):
super(AddSymbolFileAuto, self).__init__("add-symbol-file-auto", gdb.COMMAND_FILES)
def invoke(self, solibpath, from_tty):
from os import path
self.dont_repeat()
if os.path.exists(solibpath) == False:
print ("{0}: No such file or directory." .format(solibpath))
return
offset = self.get_text_offset(solibpath)
gdb_cmd = "add-symbol-file %s %s" % (solibpath, offset)
gdb.execute(gdb_cmd, from_tty)
def get_text_offset(self, solibpath):
import subprocess
elfres = subprocess.check_output([READELF_BINARY, "-WS", solibpath])
for line in elfres.splitlines():
if "] .text " in line:
return "0x" + line.split()[4]
return "" # TODO: Raise error when offset is not found?
def complete(self, text, word):
return gdb.COMPLETE_FILENAME
AddSymbolFileAuto()
end
使用示例:
add-symbol-file-auto foo.symbol
请注意,仅使用add-symbol-file
加载符号就可以设置断点,但这并不意味着您可以使用它做一些有用的事情,例如实际触发断点。使用info sharedlibrary
(或info shared
)验证符号是否确实与调试目标相关(可以选择使用一个模式来显示特定结果,而不是所有结果)。它应该看起来像这样:
(gdb) gdb-symbol-file-auto path/to/library.symbols
(gdb) info shared symbol-file
From To Syms Read Shared Object Library
0x0000abc0 0x0000def0 Yes path/to/library
不使用加载的符号时,将显示以下内容:
From To Syms Read Shared Object Library
0x0000abc0 0x0000def0 Yes (*) path/to/library
(*): Shared library is missing debugging information.
当GDB根本无法加载库时(例如if GDB has a bug),会显示以下内容:
From To Syms Read Shared Object Library
0x0000abc0 0x0000def0 No path/to/library
https://stackoverflow.com/questions/20380204
复制相似问题