it-swarm-ru.tech

Как вы снова запускаете программу в gdb с "target remote"?

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

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

25
jfm3
10
pdileepa

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

jump function

или же 

set $pc=address.

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

Правка:

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

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

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

6
Drew Frezell

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

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

4
Employed Russian

"Jump _start" - это обычный способ.

2
Michael Snyder

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

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

1
hermannk

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

Дистанционный пульт:

# 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 спросит вас, хотите ли вы перезапустить программу

0
Jehandad

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

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

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

0
Steven Eckhoff