Удаленная отладка GDB, похоже, не может найти символы

Я пытаюсь удаленно отлаживать приложение, запущенное на машине с адресом 192.168.98.64. На этой машине я запускаю:

gdbserver serveripaddr:4444 progname

то с сервера я запускаю "gdb", затем в командной строке gdb:

(gdb)  target remote 192.168.98.64:4444
Remote debugging using 192.168.98.64:4444
[New Thread 28432]
warning: Could not load vsyscall page because no executable was specified
try using the "file" command first.
0xb775e810 in ?? ()
(gdb) break internal[TAB]

Я ожидал нажатия клавиши TAB при попытке установить точку останова, чтобы вызвать список соответствующих функций, начиная с внутреннего, но ничего не вызывает. Код был скомпилирован с включенной отладкой с -g. Что я делаю неправильно?

Ответ 1

Я запускаю "gdb"

Вы должны предоставить GDB исполняемый файл, который вы отлаживаете (желательно его без разделительной версии):

gdb /path/to/progname
(gdb) target remote 192.168.98.64:4444

Ответ 2

Я просто столкнулся с этой проблемой сам, когда использовал кросс-скомпилированный gdb (вам это вообще понадобится, если ваш удаленный хост имеет другую архитектуру). В этом случае символы должны быть прочитаны из двоичного файла, скомпилированного на удаленном хосте. Я понял, что для меня работает следующее (также, если архитектуры на хостах одинаковы):

На удаленном хосте:

gdbserver [host]:[port] [remote-path-to-binary-from-gdbserver-workdir]

а затем на локальном хосте в (кросс-скомпилированном) gdb:

shell sleep 5
target remote [host]:[port]
symbol-file remote:[remote-path-to-binary-from-gdbserver-workdir]
directory [local-root-directory-for-source-files]
continue

Замените [*] вашими данными. Вы можете использовать его как gdb script (следовательно, sleep в первой строке) или ввести его в свою командную строку gdb. Необязательная строка каталога сообщает, что она добавляет локальный исходный каталог в путь поиска для источников. Это может быть полезно, если вы используете интерфейс, который указывает на исходный код.

Ответ 3

При отладке удаленного клиента gdb не знает, откуда загрузить символы. У вас есть два варианта:

1. specify executable when starting gdb

gdb <executable>
(gdb) target remote <IP>:<port>
(gdb) load <executable>
 gdb should know symbols now
(gdb) b main
(gdb) mon reset
(gdb) contnue
 it should break at main
(gdb) bt

2. use file command to tell about the symbols.

gdb
(gdb) target remote <IP>:<port>
(gdb) load <executable>
(gdb) file <executable>
 gdb should know symbols now
(gdb) b main
(gdb) mon reset
(gdb) contnue
 it should break at main
(gdb) bt

PS: убедитесь, что вы скомпилировали исполняемый файл с символами отладки -g -O0