Как установить точку останова на функцию в общей библиотеке, которая не была загружена в 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