同じコンピューター上の実行可能ファイルで通常の gdb セッションを実行している場合、run コマンドを実行すると、プログラムが最初からやり直されます。
コマンドのように組み込みシステムで gdb を実行している場合target localhost:3210
、gdb セッションを終了して再起動せずにプログラムを最初からやり直すにはどうすればよいでしょうか?
残念ながら、アプリケーションを再起動してセッションを維持する方法がわかりません。回避策は、PCをプログラムのエントリポイントに戻すことです。これを行うには、次のいずれかを呼び出します。
jump function
また
set $pc=address
。
あなたがあなたに議論をぶち壊したならば、main
あなたはそれらを再び設定する必要があるかもしれません。
編集:
上記の方法には、問題を引き起こす可能性のあるいくつかの注意事項があります。
したがって、ジャンプを使用することは、プログラムを再起動することと同じではありません。
おそらく、組み込みシステムでgdbserverを実行しています。
target extended-remoteで終了する代わりに、プログラムを再起動するように要求できます。
「jump _start」は通常の方法です。
ステップバイステップの手順
リモート:
# 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
、これには次の煩わしさがあります。
show args
ず、再起動後も持続しません: https://sourceware.org/bugzilla/show_bug.cgi?id=21980環境変数を渡し、再起動せずに作業ディレクトリを変更する: gdbserver --multi の環境変数と作業ディレクトリを再起動せずに変更するには?
通常の gdb を実行している場合は、'run' ショートカット 'r' と入力すると、gdb がプログラムを再起動するかどうか尋ねてきます。
私にとっては、 21.2 サンプル GDB セッションの起動で説明されている方法がうまく機能します。monitor reset halt
「(gdb)」プロンプトで後で入力すると、ターゲット ハードウェアがリセットされ、(= continue) でアプリケーションを再起動できますc
。
プログラムを何度もフラッシュする必要がないため、実行間でload
コマンドを省略できます。