Я хочу отладить процесс, работающий в 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?