【发布时间】:2020-08-07 08:25:39
【问题描述】:
我正在使用 CentOS。我没有设置服务器,环境很旧。
我尝试调试多线程服务器程序,但出现了一些错误。
Starting program: ./battle
Trying host libthread_db library: libthread_db.so.1.
Host libthread_db.so.1 resolved to: /lib64/libthread_db.so.1.
td_ta_new failed: application not linked with libthread
thread_db_load_search returning 0
warning: Could not load shared library symbols for linux-vdso.so.1.
Do you need "set solib-search-path" or "set sysroot"?
Trying host libthread_db library: libthread_db.so.1.
Host libthread_db.so.1 resolved to: /lib64/libthread_db.so.1.
td_ta_new failed: versions of libpthread and libthread_db do not match
Trying host libthread_db library: /lib64/libthread_db.so.1.
td_ta_new failed: versions of libpthread and libthread_db do not match
thread_db_load_search returning 0
warning: Unable to find libthread_db matching inferior's thread library, thread debugging will not be available.
然后我意识到问题是我链接的libpthread共享库的版本与gdb在调试时使用的libthread_db共享库的版本不匹配。
我阅读了这两个相关问题Unable to Debug Multi-Threaded Application with gdb,GDB debugging warnings。
然后我尝试使用file 命令找出每个版本是什么(请告诉我使用file 检查差异是否正确。无论如何,我发现了一些差异。 )
ldd battle
linux-vdso.so.1 (0x00007fffcafff000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f390c675000)
.........
ls -l libpthread*
-rwxr-xr-x 1 root root 143280 Apr 9 2019 libpthread-2.12.so
-rwxr-xr-x 1 root root 806517 Dec 2 2018 libpthread-2.17.so
lrwxrwxrwx 1 root root 18 Jul 29 07:35 libpthread.so.0 -> libpthread-2.17.so
ls -l libthread_db*
-rwxr-xr-x 1 root root 34488 Apr 9 2019 libthread_db-1.0.so
lrwxrwxrwx 1 root root 19 Jul 29 07:35 libthread_db.so.1 -> libthread_db-1.0.so
file libpthread-2.17.so
libpthread-2.17.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.16, not stripped
file libthread_db-1.0.so
libthread_db-1.0.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, not stripped
file libpthread-2.12.so
libpthread-2.12.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, not stripped
所以我的程序链接到libpthread-2.17.so ,用于for GNU/Linux 2.6.16,而gdb 使用libthread_db-1.0.so,用于for GNU/Linux 2.6.18,不匹配? (好吧,我不确定是否可以根据这些信息比较它们,我可以吗?)
这是否意味着现在我需要下载一个用于for GNU/Linux 2.6.16 的libthread_db-1.0.so 并将libthread_db.so.1 链接到它? 我可以从哪里下载它?
顺便说一句,我也觉得奇怪,对于我服务器上的libpthread-2.17.so和libpthread-2.12.so,2.17 > 2.12,前者应该是更新的版本。但它适用于较低的 Linux 版本(2.6.16),也许有人只是复制它并重命名文件?我不知道。 :(
【问题讨论】:
-
不幸的是,在 CentOS 中更新库是一个皮塔,可能会导致系统变砖。你可以做的是下载 thread_db 的源代码(或其他任何名称)并自己编译它。然后安装它别处。然后将新的库路径添加到 LD_LIBRARY_PATH
-
@ewong 我不能只下载一个用于
for GNU/Linux 2.6.16的libthread_db.so.1,然后创建一个符号链接libthread_db.so.1 -> the one I download.so吗? -
假设它适合您的系统,我相信如此。我只是通常构建它并在其他地方安装库.. 抱歉无法提供帮助
-
@Rick 这个blog post 可能会有所帮助
标签: linux gdb shared-libraries