Как вы снова запускаете программу в gdb с «target remote»? - PullRequest
25 голосов
/ 16 сентября 2008

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

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

Ответы [ 8 ]

10 голосов
/ 05 марта 2011
6 голосов
/ 17 сентября 2008

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

jump <em>function</em>

или

set $pc=<em>address</em>.

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

Edit:

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

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

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

4 голосов
/ 06 декабря 2008

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

Вы можете попросить его перезапустить вашу программу вместо выхода с target extended-remote

2 голосов
/ 15 марта 2017

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

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

2 голосов
/ 29 октября 2009

«Jump_start» - это обычный способ.

1 голос

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

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

# 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 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 без перезапуска?

0 голосов
/ 27 июня 2017

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

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

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

0 голосов
/ 13 марта 2016

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

...