我像这样运行gdb:
x-compiler-gdb path/to/u-boot
其中“x-compiler”就是我正在使用的交叉编译器后缀,
/path/to
是我的u-boot文件所在的路径。
然后在 GDB 中我做了类似的事情:
(gdb) target extended-remote :3333
Remote debugging using :3333
(gdb) p/x (*(struct global_data*)$r9)->relocaddr
$1 = 0x27f7a000
这很酷,因为它将重定位地址存储在一个名为
$1
的变量中
(gdb) symbol-file
Discard symbol table from `/home/...../u-boot'? (y or n) y
No symbol file now.
(gdb) add-symbol-file u-boot $1 <------------- HERE
add symbol table from file "u-boot" at
.text_addr = 0x12345678
(y or n) y
Reading symbols from u-boot...
(gdb)
我能够使用变量
$1
来使用重定位地址。但接下来我想重新加载我传入的原始文件名,因为我想编写脚本并使其更加通用。
我不知道如何像
gdb <binary> U_BOOT_FILE=/path/to/binary/u-boot
那样将变量传递给gdb,以便我可以在gdb环境中使用它。
或者更好的是,我不知道如何打印/存储我传入的符号(二进制)文件的名称,以便以后可以引用它。
set confirm off
target extended-remote <remote_ip>:3333 <----- pass in the remote IP address
p/x (*(struct global_data*)$x18)->relocaddr
symbol-file
add-symbol-file u-boot-v2020.04+git999/u-boot $1 <---- Hardcoded symbol filename
您可以看到我必须对文件名进行硬编码
u-boot-v2020.04+git999/u-boot
,这可能是不同的版本或路径。
理想情况下,我会将其存储到
$2
等中 - 但我不知道这是如何完成的。任何对“gdb 变量存储”或类似内容的引用都只是引用二进制文件中的程序变量。
我还想传入远程 IP 地址,也许是
$3
注意:这是为了调试 yocto/bitbake gcc 构建的 u-boot。
我将使用 Python API 创建一个新命令。 将以下内容放入 Python 文件中,例如
/tmp/gdb-command.py
:
class ConnectAndRelocateCommand (gdb.Command):
"""
Usage: connect-and-relocate IP
Connect to IP:3333, establish the relocation address and reload
the current symbol-file at that address.
"""
def __init__ (self):
gdb.Command.__init__ (self, "connect-and-relocate", gdb.COMMAND_NONE)
def invoke(self, args, from_tty):
# 1. Grab the IP address from the arguments.
argv = gdb.string_to_argv(args)
if len(argv) != 1:
raise gdb.GdbError("usage: connect-and-relocate IP")
ip = argv[0]
# 2. Connect to the remote server.
gdb.execute(f"target extended-remote {ip}:3333")
# 3. Find filename of current symfile.
pspace = gdb.selected_inferior().progspace
symbol_file = pspace.symbol_file
if symbol_file is None:
raise gdb.GdbError("no symbol file loaded")
filename = symbol_file.filename
# 4. Find relocation address.
reloc_addr = gdb.parse_and_eval("(*(struct global_data*)$r9)->relocaddr")
# 5. Remove symbol file.
gdb.execute("symbol-file")
# 6. Reload symbol file at relocation address.
reload_cmd = f"add-symbol-file {filename} {reloc_addr}"
gdb.execute(reload_cmd)
print("relocation complete")
ConnectAndRelocateCommand ()
print("Command script loaded OK")
然后在 GDB 会话中
source /tmp/gdb-command.py
。
假设加载脚本没有错误,您应该会看到
Command script loaded OK
消息。 您的 GDB 会话现在可以使用命令 connect-and-relocate
。 使用 help connect-and-relocate
了解更多详情。
运气好的话,这应该可以达到你想要的效果。 如果您有一些基本的 Python 知识,您应该能够调整脚本来满足您的需求。
GDB Python API 文档可以在这里找到。