Страницы

Поиск по вопросам

среда, 5 февраля 2020 г.

Отладка с помощью gdbserver

#cpp #gdb


Иногда возникает необходимость удаленной отладки и сдесь не обойтись без gdbserver,
но есть одна проблема: исходники. Чтобы gdb видел исходники, нужно чтобы они лежали
по тому же пути, что и на машине, где запущен gdbserver, что может доставить проблем
(когда например домашняя директория отличается). Можно ли решить эту проблему кроме
как созданием нового пути, который будет идентичен на обеих машинах?

PS Связанный вопрос: можно ли удаленно дебажить с помощью gdbserver программу в windows
на линуксе? У меня при попытке приконнектится (компилятор на линуксе gcc, на windows
mingw аналогичных версий) вылетает ошибка о несовместимости.
    


Ответы

Ответ 1



Исходная ситуация Определённости ради ситуация такова: * файл изначально собран на удалённой машине * исходники лежали в /server/src/path * из них собран файл /server/bin/myapp * файл собран cmake'ом или чем-то подобным и компилятору передавались полные пути * отладочную информацию собрать не забыли (ключик -g или -ggdb) * на локальной машине точно такое же дерево исходников лежит в /home/user/src/path Запускаем: r$ gdbserver 192.168.0.16:5555 /server/bin/myapp Подключаемся: (gdb) target remote 192.168.0.16:5555`
И видим: Remote debugging using 192.168.0.16:5555 warning: No executable has been specified and target does not support determining executable automatically. Try using the "file" command. warning: Could not load vsyscall page because no executable was specified 0xb7fdf1d0 in ?? () Команды вроде b main не работают, а в bt только бессмысленные адреса и вопросы, будто мы отлаживаем strip'нутый бинарник. Загрузка символов Дабы gdb мог подгрузить символы, нужно иметь точно такой же собранный файл отлаживаемой программы (или хотя бы его отладочные символы) на локальной машине. Так что копируем его: l$ scp 192.168.0.16:/server/bin/myapp /tmp/myapp или с помощью самого gdb: (gdb) remote get /server/bin/myapp /tmp/myapp Затем загружаем файл: (gdb) file /tmp/myapp И заново запускаем gdbserver/подключаемся и видим, что ситуация улучшилась: (gdb) b main Breakpoint 1 at 0x804840d: file /server/src/path/myapp.c, line 4. (gdb) c Continuing. Reading /lib/i386-linux-gnu/libc.so.6 from remote target... Reading /lib/i386-linux-gnu/libc-2.15.so from remote target... Reading /lib/i386-linux-gnu/.debug/libc-2.15.so from remote target... Breakpoint 1, main () at /server/src/path/myapp.c:4 4 /server/src/path/myapp.c: Нет такого файла или каталога. (gdb) bt #0 main () at /home/alexander/tmp/foo.c:4 list, step и next по прежнему не работают ввиду того, что исходники отличаются. Коррекция положения исходных кодов. Т.к. уже условились, что копия дерева исходников лежит в /home/user/src/path, следующей команды должно быть достаточно: (gdb) set substitute-path /server/foo/path /home/user/src/path После этого всё ожидаемое должно работать: (gdb) l 1 #include 2 3 int main() { 4 getc(stdin); 5 return 0; 6 } Другие возможности по заданию расположения исходников Если, например, локально исходники лежат в /local/path/server/foo/path, то можно обойтись: directory /local/path или если все *.cpp лежат в одной папке/нужен конкретный файл, то в directory можно указать путь только к ним: directory ` /local/path/src` Подробности в Debugging with GDB

Комментариев нет:

Отправить комментарий