2008-09-17 79 views
24

我有一个核心文件在远程系统上生成,我无法直接访问它。我也有来自远程系统的库文件的本地副本,以及崩溃程序的可执行文件。如何在Linux上的gdb中加载核心文件时预先安装目录库路径

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

例如:

gdb path/to/executable path/to/corefile 

我的库在当前目录中。

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

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

回答

39

启动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

+0

我弄错了路径,所以你可能想更新你的答案来匹配。我会赞成这个答案,因为它部分符合我的要求,但我应该更清楚地陈述我想在库路径上预先指定一个位置,而不是替换它(我使用“override”这个词是不好的)。 – 2008-09-17 15:42:10

+0

谢谢,这真的帮助我! – 2010-09-29 16:41:38

+0

在我的情况下,可执行文件和它的库是在一个挂载NFS的树中,而我想调试的主机是NFS服务器,所以我在树中放置了一个符号链接,这样solib-absolute-prefix nfs-share-tree是确切的解决方案。我希望这有助于子孙后代。 – 2012-06-05 18:21:30

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中是否可行,但我不是专家。

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

ldd path/to/executable 

我们需要知道您的共享库如何与您的可执行文件链接。要做到这一点,请使用以下命令:

readelf -d path/to/executable | grep RPATH 
  • 如果该命令打印什么,动态连接器将使用标准的位置加上PATH环境变量才能找到共享库。

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

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

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

对于进一步的信息,你可以这样开始:

man ld.so 
0

一个重要的提示:

如果你正在做一个交叉编译,并试图用后GDB调试,然后 你已经完成
file ECECUTABLE_NAME如果你看到水手。如:

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

然后检查您的目标系统是否有libthread_db。我在网上发现了很多类似的问题。这样的问题不能用“set solib-”来解决,你必须使用交叉编译器来编译libthread_db。

2

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

相关问题