Подтвердить что ты не робот

Как вы снова запускаете программу в gdb с помощью "целевого пульта"?

Когда вы выполняете обычный сеанс gdb в исполняемом файле на том же компьютере, вы можете дать команду run, и он запустит программу снова.

Когда вы запускаете gdb во встроенной системе, как и с командой target localhost: 3210 ', как вы запускаете программу заново, не покидая и перезагружая сеанс gdb?

4b9b3361

Ответ 2

К сожалению, я не знаю, как перезапустить приложение и поддерживать сеанс. Обходной путь - установить ПК обратно в точку входа вашей программы. Вы можете сделать это, вызвав:

jump function

или

set $pc=address.

Если вы перепутали аргументы с main, вам может понадобиться настроить их снова.

Edit:

Существует несколько предостережений с указанным выше методом, которые могут вызвать проблемы.

  • Если вы находитесь в многопоточной программе, прыгающей на главный, вы перетащите текущий поток на главный, все остальные потоки останутся. Если текущий поток удерживает блокировку... тогда у вас есть некоторые проблемы.
  • Утечки памяти, если вы программируете поток, выделяете некоторые вещи во время инициализации, тогда вы просто просочились в кучу памяти с помощью прыжка.
  • Открытые файлы все равно останутся открытыми. Если вы mmap некоторые файлы или адрес, вызов, скорее всего, не удастся.

Итак, использование перехода - это не то же самое, что перезапуск программы.

Ответ 3

Предположительно, вы запускаете gdbserver во встроенной системе.

Вы можете попросить его перезагрузить свою программу, а не выйти из target extended-remote

Ответ 4

"jump_start" - обычный способ.

Ответ 5

Пошаговая процедура

Пульт дистанционного управления:

# pwd contains cross-compiled ./myexec
gdbserver --multi :1234

Local:

# 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
(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

и ./prog устраняет необходимость в set remote exec-file ./myexec, но это имеет следующие неприятности:

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

Ответ 6

Если вы используете обычный gdb, вы можете набрать 'run' shortcut 'r', и gdb спросит вас, хотите ли вы перезапустить программу

Ответ 7

Для меня метод, описанный в 21.2 Пример запуска сеанса GDB отлично работает. Когда я введу monitor reset halt позже в приглашении "(gdb)" целевое аппаратное обеспечение reset, и я могу повторно запустить приложение с помощью c (= continue).

Команда load может быть пропущена между прогонами, потому что нет необходимости снова и снова запускать программу.

Ответ 8

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

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

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