Как запустить программу заново в GDB с «целевым удаленным доступом»?
Вопрос
Когда вы выполняете обычный сеанс GDB с исполняемым файлом на том же компьютере, вы можете дать команду запуска, и она запустит программу заново.
Когда вы запускаете GDB во встроенной системе, как в случае с командой target localhost:3210', как запустить программу заново, не выходя и не перезапуская сеанс GDB?
Решение
Другие советы
К сожалению, я не знаю, как перезапустить приложение и сохранить сеанс.Обходной путь — вернуть компьютер в точку входа вашей программы.Вы можете сделать это, вызвав:
jump функция
или
set $pc=адрес
.
Если вы испортили аргументы main
возможно, вам придется настроить их заново.
Редактировать:
При использовании описанного выше метода есть несколько предостережений, которые могут вызвать проблемы.
- Если вы находитесь в многопоточной программе, переход к основному потоку приведет к переходу текущего потока к основному, все остальные потоки останутся.Если текущий поток удерживает блокировку... значит, у вас есть проблемы.
- Утечки памяти: если поток программы выделяет что-то во время инициализации, то вы просто потеряли кучу памяти при прыжке.
- Открытые файлы по-прежнему останутся открытыми.Если вы отобразите какие-то файлы или адрес, вызов, скорее всего, завершится неудачей.
Таким образом, использование перехода — это не то же самое, что перезапуск программы.
Предположительно, вы используете gdbserver во встроенной системе.
Вы можете попросить его перезапустить программу вместо выхода с помощью целевой расширенный удаленный
«Jump _start» — обычный способ.
Для меня метод, описанный в 21.2 Пример запуска сеанса GDB прекрасно работает.Когда я вхожу monitor reset halt
позже при появлении приглашения «(gdb)» целевое оборудование сбрасывается, и я могу перезапустить приложение с помощью c
(= продолжить).
А load
Команду можно опускать между запусками, поскольку нет необходимости прошивать программу снова и снова.
Пошаговая процедура
Удаленный:
# pwd contains cross-compiled ./myexec
gdbserver --multi :1234
Местный:
# pwd also contains the same cross-compiled ./myexec
gdb -ex 'target extended-remote 192.168.0.1:1234' \
-ex 'set remote exec-file ./myexec' \
--args ./myexec arg1 arg2
(gdb) r
[Inferior 1 (process 1234) exited normally]
(gdb) r
[Inferior 1 (process 1235) exited normally]
(gdb) monitor exit
Протестировано в Ubuntu 14.04.
Также можно передать программе аргументы CLI следующим образом:
gdbserver --multi :1234 ./myexec arg1 arg2
и ./myexec
часть устраняет необходимость set remote exec-file ./myexec
, но это имеет следующие неприятности:
- недокументировано: https://sourceware.org/bugzilla/show_bug.cgi?id=21981
- не отображается на
show args
и не сохраняется при перезапуске: https://sourceware.org/bugzilla/show_bug.cgi?id=21980
Передайте переменные среды и измените рабочий каталог без перезапуска: Как изменить переменные среды и рабочий каталог gdbserver --multi без его перезапуска?
Если вы используете обычный GDB, вы можете ввести ярлык «Run» «r», и GDB спросит вас, хотите ли вы перезапустить программу.
В EFM32 Happy Gecko ни одно из предложений мне не помогло, поэтому вот что я узнал из документации по интеграции GDB в среду Eclipse.
(gdb) mon reset 0
(gdb) continue
(gdb) continue
Это приводит меня в состояние, которого я ожидал при нажатии кнопки сброса из IDE.