Отладка/трассировка внутри общей библиотеки во время выполнения?

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

Какие-либо предложения?


person EightyEight    schedule 26.08.2009    source источник


Ответы (3)


Сначала вы можете сделать «break main». К тому времени, когда вы нажмете это, разделяемая библиотека должна быть загружена, и вы можете установить точку останова в любой из ее подпрограмм.

person Jim Lewis    schedule 26.08.2009
comment
Да, но убедитесь, что вы скомпилировали эту библиотеку с параметром -g и с отключенными оптимизациями! - person Alex; 27.08.2009
comment
К сожалению, это не помогло. Функция по-прежнему не видна даже из main. Есть ли что-нибудь, что я могу добавить в код, чтобы выполнение остановилось и попало в отладчик? - person EightyEight; 27.08.2009
comment
@EightyEight: Хм, мне это подходит. Возможно, библиотека, которую вы пытаетесь отладить, загружается динамически через dlopen()? Это может объяснить, почему он до сих пор не виден в main. Если это так, вы можете установить начальную точку останова после вызова dlopen для целевой библиотеки, а затем установить конечную точку останова. Кажется, должен быть более простой способ; Я буду искать. - person Jim Lewis; 27.08.2009
comment
Кстати, в моем приложении, если я попытаюсь установить точку останова в разделяемой библиотеке до входа в main(), GDB предложит сделать точку останова отложенной при будущей загрузке разделяемой библиотеки. Но если я соглашусь с этим, похоже, что точка останова не разрешится даже после загрузки библиотеки. Я полагаю, это то, что вы видите? - person Jim Lewis; 27.08.2009
comment
Да, мне пришлось перекомпилировать библиотеку с -g. По какой-то причине ему все еще не нравится нотация Class::Function(), но File.cpp:linenumber работает как шарм. - person EightyEight; 30.08.2009

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

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

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

person Employed Russian    schedule 29.08.2009
comment
Это решение не будет работать при отладке клиентского приложения Oracle SQLPlus. - person Kapil Vyas; 16.02.2018

Проверь это:

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

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

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

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

person EdH    schedule 29.08.2009