GDB Загрузка неверной библиотеки
У меня есть две разные версии библиотеки, скажем, libxyz.so
в двух разных местах
1) /home/maverick/dev/libxyz.so ( development Version)
2) /home/maverick/prod/libxyz.so ( Production Version )
У меня есть настройки, которые компилируют мою программу и связывают с соответствующей версией библиотеки в зависимости от LD_LIBRARY_PATH. например, если я хочу связать свою программу с версией dev для libxyz.so, я изменяю свой LD_LIBRARY_PATH на добавление / home / maverick / dev, и если я хочу связать с версией prod, я изменяю LD_LIBRARY_PATH для добавления / home / maverick / prod.
Я скомпилировал мою программу, связавшись с версией dev и выводом
ldd MyProg
является
libxyz.so => /home/maverick/dev/libxyz.so
Если я запускаю программу, она загружает libxyz.so из
/home/maverick/dev/libxyz.so
и работает нормально. в этот момент мой LD_LIBRARY_PATH включает / home / maverick / dev not / home / maverick / prod
но когда я пытаюсь отладить эту программу через GDB
gdb MyProg
он загружает libxyz.so из расположения
/home/maverick/prod/libxyz.so
У меня проблемы с загрузкой GDB правильной версии библиотеки во время отладки. Так что до сих пор я сначала запускаю программу (которая загружает версию dev) и присоединяет gdb к этому PID, так что все работает нормально. но если он работает как
gdb MyProg
это не
Я пытался все исправить, например, настроить sysroot, solib-search-path в GDB, но ничего не получалось. если факт, когда я настроил sysroot, чтобы указать на отладочную версию библиотеки, GDB дал какое-то сообщение вроде
.dynamic section for XXX is not at the expected address
Любое предложение будет оценено.
1 ответ
У меня проблемы с загрузкой GDB правильной версии библиотеки во время отладки.
Дай угадаю: ты используешь tcsh
, право?
Скорее всего, проблема исходит от вашего ~/.cshrc
сброс LD_LIBRARY_PATH
в /home/maverick/prod
,
Когда ты run
программа в GDB, она выполняет $SHELL -c your-program [args...]
(чтобы позволить вам использовать перенаправление ввода / вывода).
Решение: не трогайте окружающую среду в вашем .cshrc
для неинтерактивной оболочки, например, запустите ее с:
if ($?prompt == 0) exit