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
Другие вопросы по тегам