我有一个可以安装在linux服务器上各种(多个)位置的应用程序。当核心发生时,核心文件包含相对于该实例的库路径。然而,要调试该核心文件,我需要在另一个系统上执行它,因为我无法经常访问它所发生的那个。那么我的问题是如何设置gdb指向我的本地版本的共享库,而不是试图在核心发生时它们所处的路径中找到它们?
我意识到这可能有点令人困惑,所以这里有一个例子......(请记住我只是编写这些文件/库名)。
在服务器1上,位置/ var / service / myfolder中有一个名为myapp的应用程序。在该文件夹中有一个名为libXXX.so的库,由myapp使用。
在服务器2上,相同的应用程序位于/ temp中,与libXXX.so文件的版本相同。
服务器1:
[root @ server1] #ll / var / service / myfolder 共20 -rw-r - r-- 1 root admin 0 Nov 2 09:55 libXXX.so -rwxr-xr-x 1 root root 288 Nov 2 09:55 myapp
[root @ server2] #ll / temp 共20 -rw-r - r-- 1 root admin 0 Nov 2 09:55 libXXX.so -rwxr-xr-x 1 root root 288 Nov 2 09:55 myapp
当我从服务器1获取核心文件并尝试在服务器2上调试它时,我收到以下错误:
警告:“/ var / service / myfolder / libXXX.so”的.dynamic部分不在预期的地址(错误的库或版本不匹配?)
如果我查看共享图书馆,我会看到:
(gdb)info sharedlibrary 从To Syms读取共享对象库 0x00b6ab30 0x00b86144是/var/service/myfolder/libXXX.so
如何告诉gdb忽略/ var / service / myfolder版本并使用/ temp版本?
我尝试过设置solib路径,符号文件等的各种组合,但我无法想出正确的组合。
注意:是的,我意识到我可以简单地将/ temp版本复制或链接到server2上的/ var / service / myfolder,但这并不总是可行。
使用来自Employed Russian的答案时,它仍然不会删除指向原始库位置的链接。请注意,该文件夹中有这些库的版本,我只是不想使用它们。如果在默认位置找不到库,并且将使用新提供的路径,答案提供的内容很可能会有效,但是如何阻止它查看原始路径呢?
...前
[root@server1 temp]# gdb /temp/app1/app1
GNU gdb (GDB) Red Hat Enterprise Linux (7.2-75.el6)
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /temp/app1/app1...done.
(gdb) set sysroot /
(gdb) set solib-search-path /temp/app1
(gdb) core testapp1.core
[New Thread 4409]
[New Thread 4407]
[New Thread 4405]
warning: .dynamic section for "/var/service/app1/libXXX.so" is not at the expected address (wrong library or version mismatch?)
由于