在Linux上的gdb中加载核心文件时,如何在库路径前添加目录

Mik*_*ffe 25 linux gdb coredump path

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

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

例如:

gdb path/to/executable path/to/corefile
Run Code Online (Sandbox Code Playgroud)

我的库位于当前目录中.

在过去,我见过调试器通过提供选项"-p"来实现它.或"-p/=."; 所以我的问题是:

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

Dre*_*ell 44

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

set solib-absolute-prefix ./usr
file path/to/executable
core-file path/to/corefile
Run Code Online (Sandbox Code Playgroud)

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

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

set solib-search-path <path>
Run Code Online (Sandbox Code Playgroud)

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


blt*_*txd 7

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

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

ldd path/to/executable
Run Code Online (Sandbox Code Playgroud)

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

readelf -d path/to/executable | grep RPATH
Run Code Online (Sandbox Code Playgroud)
  • 如果命令不打印任何内容,动态链接器将使用标准位置加上 LD_LIBRARY_PATH 环境变量来查找共享库。

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

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

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

要了解更多信息,您可以从以下开始:

man ld.so
Run Code Online (Sandbox Code Playgroud)