как установить точку останова на функцию в общей библиотеке, которая не была загружена в gdb

У меня есть разделяемая библиотека libtest.so, которая будет загружена в основную программу с помощью dlopen. Функция test() находится в libtest.so и будет вызываться в основной программе через dlsym. Можно ли как-нибудь установить точку останова на test?

Обратите внимание, что основная программа не была связана с libtest.so во время связывания. В противном случае я смогу установить точку останова, хотя это ожидающее действие. В моем случае, когда я делаю b test, gdb сообщит мне Function "test" not defined.


person pierrotlefou    schedule 15.04.2010    source источник
comment
Не могли бы вы установить точку останова на test после загрузки libtest.so с помощью dlopen?   -  person    schedule 15.04.2010


Ответы (4)


На самом деле gdb должен сообщить вам, что он сможет разрешить символ в будущем, когда будут загружены новые библиотеки:

(gdb) b test
Function "test" not defined.
Make breakpoint pending on future shared library load? (y or [n]) y
Breakpoint 1 (test) pending.
(gdb) r

И позже, как только объект .so будет загружен, он разрешит точку останова, например:

Reading symbols for shared libraries . done
Breakpoint 1 at 0xcafebebe
Pending breakpoint 1 - "test" resolved
person diciu    schedule 15.04.2010
comment
В GDB, который я использую, даже если я устанавливаю точку останова в ожидании, он НЕ будет спрашивать меня, хочу ли я ожидающего поведения, если символ не определен. Он просто говорит мне, что не могу найти члена бла-бла Подсказка попробуйте вкладку бла-бла - person cardiff space man; 16.08.2013

На самом деле, этот метод не всегда будет работать.

Предположим, у меня есть несколько разделяемых библиотек, каждая из которых имеет функцию с именем «Init». Если я загрузил другую библиотеку, то "b Init" установит точку останова на неправильный экземпляр функции "Init". Поэтому я должен указать точку останова следующим образом:

(gdb) b объект5.c:66

Нет исходного файла с именем object5.c.

person Michael    schedule 15.12.2010
comment
В моем случае проблема, которую я обнаружил, мне приходится компилировать с символами отладки (чтобы поместить точки останова в пользовательский .so). - person Fernando Gonzalez Sanchez; 25.02.2015

Другой способ — указать имя файла и функцию der, например:

b object5.c:test

Это должно быть уникальным. Возможно, вы также хотите указать путь к исходному коду (как уже предлагалось):

set directories path_of_object5.c
person musbach    schedule 30.05.2016

как установить точку останова на общей библиотеке.

Довольно часто в разделяемой библиотеке есть точка останова. Совместно используемые библиотеки могут загружаться и выгружаться явно и, возможно, неоднократно, по мере выполнения программы. Для поддержки этого варианта использования gdb обновляет местоположения точек останова всякий раз, когда загружается или выгружается какая-либо разделяемая библиотека. Как правило, вы устанавливаете точку останова в разделяемой библиотеке в начале сеанса отладки, когда библиотека не загружена и символы из библиотеки недоступны. Когда вы пытаетесь установить точку останова, gdb спросит вас, хотите ли вы установить так называемую отложенную точку останова — точку останова, адрес которой еще не разрешен.

цитата из https://sourceware.org/gdb/onlinedocs/gdb/Set-Breaks.html

(gdb) b object5.c:66 Нет исходного файла с именем object5.c.

возможно, вы можете использовать «установить каталог the_location_of_object5.c_file», чтобы исправить это.

person jasonxiaole    schedule 15.10.2013