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

<p>когда вы выполняете обычный сеанс gdb для исполняемого файла на том же компьютере, вы можете дать команду run, и она запустит программу заново.</p><p>когда вы запускаете gdb во встроенной системе, как, например, с командой target localhost: 3210 ', как вы снова запускаете программу, не завершая и не перезапуская сеанс gdb?</p>

<p>вы ищете <a href="http://sourceware.org/gdb/onlinedocs/gdb/server.html">многопроцессный режим для gdbserver</a> и <a href="http://sourceware.org/gdb/onlinedocs/gdb/remote-configuration.html"><code>set remote exec-file filename</code></a> </p>

<p>к сожалению, я не знаю, как перезапустить приложение и по-прежнему поддерживать ваш сеанс. обходной путь - вернуть пк к точке входа вашей программы. вы можете сделать это, позвонив:</p><p><code>jump <em>function</em></code></p><p>или же </p><p><code>set $pc=<em>address</em></code>.</p><p>если вы спрятали аргументы в <code>main</code>, возможно, вам придется установить их снова.</p><p>правка:</p><p>есть несколько предостережений с вышеупомянутым методом, которые могут вызвать проблемы.</p><ul> <li>если вы находитесь в многопоточной программе, переход к основному приведет к переходу текущего потока на основной, все остальные потоки останутся. если текущий поток удерживал блокировку ... тогда у вас есть некоторые проблемы.</li> <li>утечки памяти, если ваш программный поток выделяет некоторые вещи во время инициализации, то вы просто пропустили кучу памяти с помощью перехода.</li> <li>открытые файлы останутся открытыми. если вы отобразите некоторые файлы или адрес, вызов, скорее всего, не удастся.</li> </ul><p>таким образом, использование перехода не то же самое, что перезапуск программы.</p>

<p>предположительно, вы используете gdbserver во встроенной системе.</p><p>вы можете попросить его перезапустить вашу программу вместо выхода с <a href="http://web.archive.org/web/20090605020212/http://sourceware.org/gdb/current/onlinedocs/gdb\_19.html">target extended-remote</a> </p>

<p>"jump \_start" - это обычный способ.</p>

<p>для меня метод, описанный в <a href="http://openocd.org/doc/html/gdb-and-openocd.html#sample-gdb-session-startup">21.2 пример запуска сессии gdb</a> отлично работает. когда я ввожу <code>monitor reset halt</code> позже в приглашении «(gdb)», целевое оборудование сбрасывается, и я могу перезапустить приложение с помощью <code>c</code> (= continue).</p><p>команда <code>load</code> может быть пропущена между запусками, потому что нет необходимости перепрограммировать программу снова и снова.</p>

<p><strong>пошаговая процедура</strong></p><p>дистанционный пульт:</p><pre><code># pwd contains cross-compiled ./myexec gdbserver --multi :1234 </code></pre><p>местный:</p><pre><code># 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 </code></pre><p>проверено в ubuntu 14.04.</p><p>также возможно передать аргументы cli в программу как:</p><pre><code>gdbserver --multi :1234 ./myexec arg1 arg2 </code></pre><p>и часть <code>./myexec</code> устраняет необходимость в <code>set remote exec-file ./myexec</code>, но это имеет следующие неудобства:</p><ul> <li>без документов: <a href="https://sourceware.org/bugzilla/show\_bug.cgi?id=21981">https://sourceware.org/bugzilla/show\_bug.cgi?id=21981</a> </li> <li>не отображается в <code>show args</code> и не сохраняется при перезапуске: <a href="https://sourceware.org/bugzilla/show\_bug.cgi?id=21980">https://sourceware.org/bugzilla/show\_bug.cgi?id=21980</a> </li> </ul><p>передайте переменные окружения и измените рабочий каталог без перезапуска: <a href="https://stackoverflow.com/questions/45149858/how-to-modify-the-environment-variables-of-gdbserver-without-restarting-it">как изменить переменные окружения и рабочий каталог gdbserver --multi без перезапуска?</a> </p>

<p>если вы работаете с обычным gdb, вы можете набрать 'run' ярлык 'r' и gdb спросит вас, хотите ли вы перезапустить программу</p>

<p>на efm32 happy gecko ни одно из предложений не сработало бы для меня, поэтому вот что я узнал из документации по интеграции gdb в среду eclipse.</p><pre><code>(gdb) mon reset 0 (gdb) continue (gdb) continue </code></pre><p>это приводит меня в состояние, которое я ожидал бы при нажатии на сброс из ide.</p>