同じコンピューター上の実行可能ファイルで通常のgdbセッションを実行しているときに、runコマンドを指定すると、プログラムが再び開始されます。
組み込みシステムでgdbを実行している場合、コマンドtarget localhost:3210 'のように、gdbセッションを終了して再起動せずにプログラムを最初からやり直すにはどうすればよいですか?
残念ながら、私はアプリケーションを再起動してセッションを維持する方法を知りません。回避策は、PCをプログラムのエントリポイントに戻すことです。これを行うには、次のいずれかを呼び出します。
jump function
または
set $pc=address
。
引数をmain
に変更した場合は、再度設定する必要がある場合があります。
編集:
上記の方法には、問題を引き起こす可能性のある警告がいくつかあります。
したがって、ジャンプを使用することは、プログラムを再起動することと同じではありません。
おそらく、組み込みシステムでgdbserverを実行しています。
target extended-remote で終了する代わりに、プログラムを再起動するように要求できます。
「ジャンプ_start」が通常の方法です。
私にとって、 21.2サンプルGDBセッションの起動 で説明されている方法はうまく機能します。後で[(gdb)]でmonitor reset halt
と入力すると、ターゲットハードウェアがリセットされ、c
(=続行)でアプリケーションを再起動できます。
load
コマンドは、プログラムを何度もフラッシュする必要がないため、実行間で省略できます。
段階的な手順
リモート:
# 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=2198再起動せずに環境変数を渡して作業ディレクトリを変更します: 再起動せずにgdbserver --multiの環境変数と作業ディレクトリを変更するには?
通常のgdbを実行している場合、「run」ショートカット「r」を入力すると、gdbはプログラムを再起動するかどうかを尋ねます
EFM32 Happy Geckoでは、どの提案もうまくいきませんでした。そのため、GDBをEclipse環境に統合することに関するドキュメントから私が学んだことは次のとおりです。
(gdb) mon reset 0
(gdb) continue
(gdb) continue
これにより、IDEからリセットを押したときに予期していた状態になります。