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

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

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

Ответ 1

На самом деле 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

Ответ 2

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

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

(gdb) b object5.c: 66

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

Ответ 3

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

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

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

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

может быть, вы можете использовать "set directory the_location_of_object5.c_file", чтобы исправить это.

Ответ 4

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

b object5.c:test

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

set directories path_of_object5.c