【问题标题】:How do I prepend a directory the library path when loading a core file in gdb on Linux在 Linux 上的 gdb 中加载核心文件时,如何在目录前面添加库路径
【发布时间】:2010-09-10 04:55:47
【问题描述】:

我在无法直接访问的远程系统上生成了一个核心文件。我还有来自远程系统的库文件的本地副本,以及崩溃程序的可执行文件。

我想在 gdb 中分析这个核心转储。

例如:

gdb path/to/executable path/to/corefile

我的库在当前目录中。

在过去,我看到调试器通过提供选项“-p”来实现这一点。或“-p /=。”;所以我的问题是:

在 gdb 中分析核心文件时,如何指定首先从相对于当前目录的路径加载库?

【问题讨论】:

    标签: linux path gdb coredump


    【解决方案1】:

    在不指定可执行文件或核心文件的情况下启动 gdb,然后键入以下命令:

    set solib-absolute-prefix ./usr
    file path/to/executable
    core-file path/to/corefile
    

    您需要确保完全从目标系统镜像您的库路径。以上内容用于调试与您的主机不匹配的目标,这就是为什么复制包含您的库的根文件系统结构很重要的原因。

    如果您正在远程调试与您的主机架构和 Linux/glibc 版本相同的服务器,那么您可以按照fd 的建议进行操作:

    set solib-search-path <path>
    

    如果您尝试覆盖某些库,但不是全部,那么您可以将目标库目录结构复制到一个临时位置并使用上述solib-absolute-prefix 解决方案。

    【讨论】:

    • 我的路径有点错误,因此您可能需要更新您的答案以匹配。我会赞成这个答案,因为它部分符合我的要求,但我应该更清楚地说明我想在库路径之前添加一个位置而不是替换它(我不喜欢使用“覆盖”这个词)。
    • 谢谢,这对我很有帮助!
    • 在我的例子中,可执行文件及其库位于 NFS 挂载树中,而我想调试的主机是 NFS 服务器,所以我在树中放置了一个符号链接,以便 solib-absolute-前缀 nfs-share-tree 是确切的解决方案。我希望这对后代有所帮助。
    【解决方案2】:

    我不确定这在 gdb 中是否可行,但我不是专家。

    但是我可以评论 Linux 动态链接器。以下应打印所有已解析共享库和未解析共享库的路径。

    ldd path/to/executable
    

    我们需要知道您的共享库是如何与您的可执行文件相关联的。为此,请使用以下命令:

    readelf -d path/to/executable | grep RPATH
    
    • 如果命令不打印,动态链接器将使用标准位置和 LD_LIBRARY_PATH 环境变量来查找共享库。

    • 如果命令打印了一些行,动态链接器将忽略 LD_LIBRARY_PATH 并改用硬编码的 rpath。

      如果列出的 rpath 是绝对路径,我知道的唯一解决方案是将您的库复制(或符号链接)到列出的位置。

      如果列出的 rpath 是相对的,它们将包含一个 $ORIGIN,它将在运行时被可执行文件的路径替换。移动可执行文件或库以匹配。

    如需更多信息,您可以从以下内容开始:

    man ld.so
    

    【讨论】:

    • 非常有用的信息。与 gdb 无关,但与我查找 ld 路径的情况非常相关
    【解决方案3】:

    我在developer.apple.com找到了这段摘录

    set solib-search-path path
    

    如果设置了这个变量,路径是 以冒号分隔的目录列表 搜索共享库。 solib-search-path' is used after solib-absolute-prefix' 失败 找到库,或者如果路径 图书馆是相对的,而不是 绝对。如果你想使用 solib-search-path' instead of solib-absolute-prefix',一定要 将 `solib-absolute-prefix' 设置为 不存在的目录以防止 GDB 从找到您的主机的库。

    编辑:

    我不认为使用上述设置会预先添加我添加的目录,但它似乎确实会附加它们,因此我当前系统中丢失的文件会在我添加的路径中被拾取。我猜想将 solib-absolute-prefix 设置为虚假的内容并按照我需要的顺序在 solib-search-path 中添加目录可能是一个完整的解决方案。

    【讨论】:

      【解决方案4】:

      您也可以在调用 gdb 时将 LD_PRELOAD 设置为每个库或将 LD_LIBRARY_PATH 设置为当前目录。如果 gdb 本身尝试使用您预加载的任何库,这只会导致问题。

      【讨论】:

      • 命令 LD_LIBRARY_PATH="." gdb executableName.bin 工作正常。谢谢。
      【解决方案5】:

      一个重要提示:

      如果您正在进行交叉编译并尝试使用 gdb 进行调试,那么 在你完成后
      file ECECUTABLE_NAME 如果你看到 smth。喜欢:

      Using host libthread_db library "/lib/libthread_db.so.1"
      

      然后检查您的目标系统是否有 libthread_db。我在网上发现了很多类似的问题。此类问题仅使用“set solib-”无法解决,您还必须使用交叉编译器构建 libthread_db。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-22
        • 1970-01-01
        • 2011-11-11
        • 1970-01-01
        相关资源
        最近更新 更多