Как установить точку останова на функцию в общей библиотеке, которая не была загружена в GDB - PullRequest
13 голосов
/ 15 апреля 2010

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

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

Ответы [ 4 ]

14 голосов
/ 15 апреля 2010

На самом деле 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, он разрешит точку останова, например ::10000

Reading symbols for shared libraries . done
Breakpoint 1 at 0xcafebebe
Pending breakpoint 1 - "test" resolved
7 голосов
/ 15 декабря 2010

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

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

(gdb) b object5.c: 66

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

1 голос
/ 30 мая 2016

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

b object5.c:test

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

set directories path_of_object5.c
1 голос
/ 15 октября 2013

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

Довольно часто иметь точку останова в общей библиотеке. Общие библиотеки могут загружаться и выгружаться явно и, возможно, многократно, по мере выполнения программы. Для поддержки этого варианта использования 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», чтобы исправить это.

...