Отладка / трассировка внутри разделяемой библиотеки во время выполнения? - PullRequest
7 голосов
/ 27 августа 2009

Я пытаюсь понять, как работает определенная библиотека. Я скомпилировал его с добавленными принтами, и все отлично. Теперь я хочу остановить пример программы во время выполнения, чтобы посмотреть на стек вызовов, но я не могу понять, как это сделать с помощью gdb. Функция, которую я хочу использовать, находится в общей библиотеке. Я рассмотрел предыдущий вопрос здесь, на SO, но этот подход не работает для меня. Рассматриваемый язык - C ++. Я попытался указать имя файла и номер строки, но GDB отказывается это понимать, он только перечисляет исходные файлы из демонстрационного приложения.

Есть предложения?

Ответы [ 3 ]

4 голосов
/ 27 августа 2009

Вы можете сначала сделать "Break Main". К тому времени, когда вы нажмете это, общая библиотека должна быть загружена, и вы сможете установить точку останова в любой из ее подпрограмм.

3 голосов
/ 29 августа 2009

Необходимо рассмотреть два случая (и ваш вопрос не проясняет, какой у вас случай):
- Ваш исполняемый файл напрямую связан с общей библиотекой:
это означает, что GDB будет «видеть» символы (и источники) из общей библиотеки, когда вы остановитесь на main
- ваш исполняемый файл динамически загружает общую библиотеку (например, через dlopen):
в этом случае GDB не увидит вашу общую библиотеку до тех пор, пока не завершится dlopen.

Поскольку вы не можете видеть символы, когда останавливаетесь на главном, я полагаю, у вас есть второй случай. Вы можете сделать "set stop-on-solib-events 1" в приглашении (gdb), и GDB будет останавливаться каждый раз, когда новая общая библиотека загружается (или выгружается).

Вы можете увидеть, какие библиотеки GDB «знает» об этом, с помощью команды info shared.
Просто подождите, пока вы не увидите вашу целевую библиотеку в этом списке, прежде чем пытаться установить в ней контрольные точки.

1 голос
/ 29 августа 2009

Проверьте это:

http://linux.die.net/man/1/ltrace

будет отслеживать ваши библиотечные вызовы - возможно, будет полезно.

И "strace" делает то же самое для системных вызовов.

И с этим вы сможете найти точку входа ... Вы можете установить точку останова в GDB таким образом (хотя я сам не могу объяснить детали)

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