Я использую 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
разделяемой библиотеки, которую я связываю, не соответствует версии libthread_db
разделяемой библиотеки, которую gdb
использует при отладке.
Я прочитал эти 2 связанных вопроса Невозможно отладить Многопотоковое приложение с предупреждениями об отладке gdb , GDB .
Затем я попытался выяснить, какая версия каждого из них, с помощью команды 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
, несоответствие? (Ну, я не уверен, могу ли я сравнить их на основе этой информации, могу я ?)
Означает ли это, что теперь мне нужно загрузить libthread_db-1.0.so
, который предназначен для for GNU/Linux 2.6.16
и ссылку libthread_db.so.1
на него? Где я могу его скачать из ?
Кстати, мне тоже странно, что для libpthread-2.17.so
и libpthread-2.12.so
на моем сервере 2.17 > 2.12
первый должен быть новее версия. Но это для младшей Linux версии (2.6.16
), может кто просто скопирует и переименует файл? Я не знаю. : (