在 gdb 中我可以保存或传递符号文件名等值以供以后使用吗?

问题描述 投票:0回答:1

我像这样运行gdb:

x-compiler-gdb path/to/u-boot

其中“x-compiler”就是我正在使用的交叉编译器后缀,

/path/to
是我的u-boot文件所在的路径。

然后在 GDB 中我做了类似的事情:

1.连接到删除会话 - 好的

(gdb) target extended-remote :3333
Remote debugging using :3333

2.找到搬家地址-ok

(gdb) p/x (*(struct global_data*)$r9)->relocaddr
$1 = 0x27f7a000

这很酷,因为它将重定位地址存储在一个名为

$1

的变量中

3.删除符号文件 - 好的

(gdb) symbol-file
Discard symbol table from `/home/...../u-boot'? (y or n) y
No symbol file now.

4.在重定位地址重新加载符号文件

(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
来使用重定位地址。但接下来我想重新加载我传入的原始文件名,因为我想编写脚本并使其更加通用。

我不知道该怎么做的事情

  1. 我不知道如何像

    gdb <binary> U_BOOT_FILE=/path/to/binary/u-boot
    那样将变量传递给gdb,以便我可以在gdb环境中使用它。

  2. 或者更好的是,我不知道如何打印/存储我传入的符号(二进制)文件的名称,以便以后可以引用它。

到目前为止我的脚本

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。

gcc gdb bitbake
1个回答
0
投票

我将使用 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 文档可以在这里找到。

© www.soinside.com 2019 - 2024. All rights reserved.