Не удается отладить общую библиотеку - символы загружаются неправильно - PullRequest
13 голосов
/ 17 июня 2011

В настоящее время я пишу небольшую библиотеку и хочу проверить ее на наличие утечек (среди прочего); однако по какой-то причине gdb не загружает символы библиотеки. Я читал много других постов здесь (и в различных других местах в Интернете) об этом, однако, я не могу найти решение. Вот что происходит:

Я компилирую разделяемую библиотеку со следующими флагами (они включены как в окончательную совместно используемую библиотеку, так и во все объектные файлы):

CFLAGS=-Wall -O0 -g -fPIC

Аналогично, я компилирую двоичный файл memtest (клиентское приложение для библиотеки) для проверки на утечки памяти и тому подобное с этими флагами

CFLAGS=-Wall -O0 -g

Теперь я вставил в библиотеку указатель NULL, чтобы проверить, смогу ли я отследить его и «отладить» указатель (т. Е. Он вызывает сбой). Поэтому я пытаюсь запустить его через GDB, но это не идет. Вывод info sharedlibrary одинаков как для исполняемого файла, так и для ядра:

(gdb) info sharedlibrary
From        To          Syms Read   Shared Object Library
... Some libraries I am not worried about debugging...
0x00d37340  0x00d423a4  Yes (*)     /home/raged/MyLIB/memtest/../lib/libMyLIB.so.0 <--- My lib
.... and some more....
(*): Shared library is missing debugging information.

Как видите, он не загружает отладочную информацию. Я не уверен, почему это так. Я собрал и связал все с флагом -g, и я даже пробовал -ggdb и -g3, но, похоже, ничего не работает должным образом. Когда я загружаю дамп ядра, вот что я вижу:

...some libs...
Reading symbols from /home/raged/MyLIB/memtest/../lib/libMyLIB.so.0...done.
Loaded symbols for /home/raged/MyLIB/memtest/../lib/libMyLIB.so.0
Reading symbols from /usr/lib/libstdc++.so.6...(no debugging symbols found)...done.
...some more libs...

Обратите внимание, что моя библиотека не выдает ошибку (no debugging symbols found) - у кого-нибудь есть идеи, почему? Как я уже говорил ранее, я не могу отладить это из-за запуска программы gdb ./memtest или из-за отладки файла ядра.

Спасибо за вашу помощь.

РЕДАКТИРОВАТЬ Также может быть важно отметить, что (если вы не поняли по пути), эта библиотека является локальной общей библиотекой (т.е. я использую -Wl,-rpath, чтобы связать / загрузить ее )

EDIT2 Кажется, моя версия GDB устарела. Теперь я обновил до последней версии с сервера CVS (я также попробовал последний выпуск version 7.2), и он может «загружать» символы. Мой info sharedlibrary теперь читает это:

0x00e418b0  0x00e4be74  Yes         /home/raged/MyLIB/memtest/../lib/libMyLIB.so.0

Однако я все еще не могу выполнить какие-либо функции (в общей библиотеке) - у кого-нибудь есть идеи?

EDIT3 Я также пытался пошагово выполнить связывание с статической библиотекой (libMyLIB.a), но она все еще не работает. Моя ОС - CentOS 5.6; Кто-нибудь знает какие-либо проблемы с этой системой? Кроме того, просто еще одно подтверждение того, что мои символы загружаются (по какой-то причине он просто не может пройти через какую-либо разделяемую функцию lib)

(gdb) sharedlibrary MyLIB
Symbols already loaded for /home/raged/MyLIB/memtest/../lib/libMyLIB.so.0

1 Ответ

3 голосов
/ 19 июня 2011

Я нашел причину, по которой это не сработало: я вызывал старый вызов функции для инициализации указателя в моем тестовом исполняемом файле.Поскольку объект никогда не создавался, я никогда не мог войти в библиотеку.Как только я обновил вызов функции, все работало хорошо.

Тем не менее, если кто-то испытывает похожие проблемы, когда все символы загружаются, убедитесь, что все указатели инициализированы должным образом, даже если они имеют правильный тип.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...