Ответ 1
Я запускаю "gdb"
Вы должны предоставить GDB исполняемый файл, который вы отлаживаете (желательно его без разделительной версии):
gdb /path/to/progname
(gdb) target remote 192.168.98.64:4444
Я пытаюсь удаленно отлаживать приложение, запущенное на машине с адресом 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. Что я делаю неправильно?
Я запускаю "gdb"
Вы должны предоставить GDB исполняемый файл, который вы отлаживаете (желательно его без разделительной версии):
gdb /path/to/progname
(gdb) target remote 192.168.98.64:4444
Я просто столкнулся с этой проблемой сам, когда использовал кросс-скомпилированный 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. Необязательная строка каталога сообщает, что она добавляет локальный исходный каталог в путь поиска для источников. Это может быть полезно, если вы используете интерфейс, который указывает на исходный код.
При отладке удаленного клиента 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