web-dev-qa-db-ja.com

「ターゲットリモート」を使用してgdbでプログラムをもう一度実行するにはどうすればよいですか?

同じコンピューター上の実行可能ファイルで通常のgdbセッションを実行しているときに、runコマンドを指定すると、プログラムが再び開始されます。

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

27
jfm3
10
pdileepa

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

jump function

または

set $pc=address

引数をmainに変更した場合は、再度設定する必要がある場合があります。

編集:

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

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

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

6
Drew Frezell

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

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

4

「ジャンプ_start」が通常の方法です。

2
Michael Snyder

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

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

2
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