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

时间:2020-03-05 18:59:09  来源:igfitidea点击:

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

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

例如:

gdb path/to/executable path/to/corefile

我的库在当前目录中。

在过去,我看到调试器通过提供选项" -p"来实现此目的。或者" -p / ="。所以我的问题是:

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

解决方案

回答

在不指定可执行文件或者核心文件的情况下启动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"解决方案。

回答

我在developer.apple.com上找到了此摘录

set solib-search-path path

  
  If this variable is set, path is a
  colon-separated list of directories to
  search  for shared libraries.
  solib-search-path' is used after
  solib-absolute-prefix' fails to
  locate the library, or if the path to
  the library is relative instead of
  absolute. If you want to use
  solib-search-path' instead of
  solib-absolute-prefix', be sure to
  set `solib-absolute-prefix' to a
  nonexistant directory to prevent GDB
  from finding your host's libraries.

编辑:

我不认为使用上面的设置来添加我添加的目录,但似乎确实要添加它们,因此,我当前系统中缺少的文件将在我添加的路径中被拾取。我猜将solib-absolute-prefix设置为伪造的,并按我需要的顺序在solib-search-path中添加目录可能是一个完整的解决方案。

回答

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

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

ldd path/to/executable

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

readelf -d path/to/executable | grep RPATH
  • 如果该命令什么都不打印,则动态链接程序将使用标准位置以及LD_LIBRARY_PATH环境变量来查找共享库。
  • 如果命令显示某些行,则动态链接程序将忽略LD_LIBRARY_PATH,而改用硬编码的rpaths。如果列出的rpath是绝对路径,则我知道的唯一解决方案是将库复制(或者符号链接)到列出的位置。如果列出的rpath是相对的,则它们将包含$ ORIGIN,它将在运行时由可执行文件的路径替换。移动可执行文件或者库以使其匹配。

有关更多信息,我们可以从以下内容开始:

man ld.so

回答

重要说明:

如果我们正在执行交叉编译并尝试使用gdb进行调试,则
完成后
如果我们看到smth,请输入文件ECECUTABLE_NAME。喜欢 :

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

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