Как запустить программу заново в GDB с «целевым удаленным доступом»?

StackOverflow https://stackoverflow.com/questions/75255

  •  09-06-2019
  •  | 
  •  

Вопрос

Когда вы выполняете обычный сеанс 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, но это имеет следующие неприятности:

Передайте переменные среды и измените рабочий каталог без перезапуска: Как изменить переменные среды и рабочий каталог gdbserver --multi без его перезапуска?

Если вы используете обычный GDB, вы можете ввести ярлык «Run» «r», и GDB спросит вас, хотите ли вы перезапустить программу.

В EFM32 Happy Gecko ни одно из предложений мне не помогло, поэтому вот что я узнал из документации по интеграции GDB в среду Eclipse.

(gdb) mon reset 0
(gdb) continue
(gdb) continue

Это приводит меня в состояние, которого я ожидал при нажатии кнопки сброса из IDE.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top