首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在gdb中加载多个符号文件

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

Stack Overflow用户
提问于 2013-12-05 00:07:18
回答 4查看 100.5K关注 0票数 38

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

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

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

EN

回答 4

Stack Overflow用户

发布于 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)
票数 19
EN

Stack Overflow用户

发布于 2014-12-18 17:06:14

除了alk的回答和评论之外,询问的地址是.text部分的地址。您可以使用readelf命令找到它

这里有一个用于二进制文件The address where filename has been loaded is missing [GDB]readelf示例

票数 12
EN

Stack Overflow用户

发布于 2020-06-19 21:11:24

来自Jaakko's answeradd-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
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20380204

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档