Как сделать так, чтобы символы gdb печатались в разделяемых библиотеках, загружаемых с помощью dlopen? - PullRequest
10 голосов
/ 09 декабря 2010

Я хочу отладить процесс, работающий в Linux 2.6 с использованием GDB. attach PID (где PID - это идентификатор процесса), print main, print sin, print gzopen и print dlopen работают (т.е. они находят соответствующие символы). Но print myfoo не работает, где myfoo - это функция, загруженная процессом из файла .so с использованием dlopen. Вот что я получаю:

(gdb) print main
$3 = {int (int, char **)} 0x805ba90 <main>
(gdb) print sin
$4 = {<text variable, no debug info>} 0xb7701230 <sin>
(gdb) print gzopen
$5 = {<text variable, no debug info>} 0xb720df50 <gzopen>
(gdb) print dlopen
$6 = {<text variable, no debug info>} 0xb77248e0 <__dlopen_nocheck>
(gdb) print myfoo
No symbol "myfoo" in current context.

Как мне заставить GDB найти myfoo?

Функция myfoo действительно существует, потому что в программе мне удалось получить ее адрес с помощью dlsym (после dlopen), и мне удалось ее вызвать. Только после этого я прикрепил GDB к процессу.

Оказалось, что с помощью команды attach $PID GDB было напечатано сообщение об ошибке mydir/mylib.so: No such file or directory. По всей видимости, GDB был запущен не в том каталоге. Выполнение правильного cd перед запуском GDB устранило проблему, и print myfoo начал работать.

Я бы хотел автоматизировать это: я хочу, чтобы GDB выяснил, где находятся мои .so файлы (загруженные с dlopen). Примером, который я могу придумать, является проверка /proc/$PID/maps (в Linux), поиск возможных каталогов и добавление их всех в путь поиска библиотеки GDB перед запуском GDB. Расширение LD_LIBRARY_PATH и выполнение set solib-search-path /tmp/parent не работали (ls -l /tmp/parent/mydir/myfoo.so работает), GDB все еще сообщал о No such file or directory. Как мне сказать GDB, где искать mydir/myfoo.so?

Мой другой вопрос: как мне получить список возможных каталогов? В Linux /proc/$PID/maps содержит их, но как насчет других операционных систем, таких как FreeBSD и Mac OS X?

Ответы [ 3 ]

4 голосов
/ 19 апреля 2014

Команда "info target" в gdb покажет список всех разделов во всех загруженных общих объектах (включая библиотеки dlopen () ed).По крайней мере, это работает в Linux - я не знаю, как он ведет себя в других операционных системах.

0 голосов
/ 10 сентября 2013

Похоже, что нет простого способа автоматизировать поиск файлов .so в GDB.

0 голосов
/ 09 декабря 2010

Я поддерживаю программу, которая загружает общую библиотеку через dlopen () и успешно обращается к символам в общей библиотеке с помощью GDB. Однако это будет работать, только если в общей библиотеке есть таблица символов.

...