34

同じコンピューター上の実行可能ファイルで通常の gdb セッションを実行している場合、run コマンドを実行すると、プログラムが最初からやり直されます。

コマンドのように組み込みシステムで gdb を実行している場合target localhost:3210、gdb セッションを終了して再起動せずにプログラムを最初からやり直すにはどうすればよいでしょうか?

4

9 に答える 9

13

gdbserver のマルチプロセス モードを探しており、set remote exec-file filename

于 2011-03-05T00:09:54.203 に答える
10

残念ながら、アプリケーションを再起動してセッションを維持する方法がわかりません。回避策は、PCをプログラムのエントリポイントに戻すことです。これを行うには、次のいずれかを呼び出します。

jump function

また

set $pc=address

あなたがあなたに議論をぶち壊したならば、mainあなたはそれらを再び設定する必要があるかもしれません。

編集:

上記の方法には、問題を引き起こす可能性のあるいくつかの注意事項があります。

  • マルチスレッドプログラムを使用している場合、mainにジャンプすると、現在のスレッドがmainにジャンプし、他のすべてのスレッドは残ります。現在のスレッドがロックを保持している場合...その後、いくつかの問題が発生します。
  • メモリリーク。プログラムフローが初期化中にいくつかのものを割り当てると、ジャンプで大量のメモリがリークされます。
  • 開いているファイルは引き続き開いたままになります。一部のファイルまたはアドレスをmmapすると、呼び出しが失敗する可能性が高くなります。

したがって、ジャンプを使用することは、プログラムを再起動することと同じではありません。

于 2008-09-16T20:35:47.367 に答える
4

おそらく、組み込みシステムでgdbserverを実行しています。

target extended-remoteで終了する代わりに、プログラムを再起動するように要求できます。

于 2008-12-06T06:43:15.913 に答える
4

「jump _start」は通常の方法です。

于 2009-10-28T21:05:29.933 に答える
3

ステップバイステップの手順

リモート:

# 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 の環境変数と作業ディレクトリを再起動せずに変更するには?

于 2017-05-24T14:35:42.490 に答える
2

通常の gdb を実行している場合は、'run' ショートカット 'r' と入力すると、gdb がプログラムを再起動するかどうか尋ねてきます。

于 2016-03-13T03:31:48.890 に答える
2

私にとっては、 21.2 サンプル GDB セッションの起動で説明されている方法がうまく機能します。monitor reset halt「(gdb)」プロンプトで後で入力すると、ターゲット ハードウェアがリセットされ、(= continue) でアプリケーションを再起動できますc

プログラムを何度もフラッシュする必要がないため、実行間でloadコマンドを省略できます。

于 2017-03-15T15:08:16.177 に答える