お仕事で、gdbを使ってクロスプラットフォームのリモートデバッグをやったのでメモ。
gdbについてはマニュアルを見てもらうとして、リモートデバッグの手順を書いてみます。
準備
手順
gdbについてはマニュアルを見てもらうとして、リモートデバッグの手順を書いてみます。
準備
- ターゲットマシンと開発ホストがシリアル又はLANで繋がっていること
- 開発ホストにターゲットマシン用のクロスgdbがインストールされていること
- ターゲットマシンにgdbserverがインストールされていること
- 開発ホストにデバッグ対象の実行ファイルとソースがあること(-ggdb つきでコンパイルされていること)
- ターゲットマシンにデバッグ対象の実行ファイルがあること
手順
- ターゲットマシンでデバッグ対象のプログラムとgdbserverを起動する
- 実行ファイルが直接起動できる場合
- 実行ファイルが直接起動できない場合
- GUI等から実行ファイルを起動する
- ps等でデバッグ対象のPIDを調べる
- gdbserverを起動する
- 開発ホストでgdbを起動する
- gdb上でリモートデバッグを指示する
- あとは、普通にgdbとして使えば良い
- デバッグをやめるときは detach と入力する。
# gdbserver 0.0.0.0:5555 prog arg...※ 5555 の部分は任意のポート番号。(LANの場合。シリアルの場合は、0.0.0.0:5555の代わりにシリアルのデバイスファイル名)
※ prog arg... の部分は、デバッグ対象の実行ファイルとコマンドラインパラメータ
# gdbserver 0.0.0.0:5555 --attach PID
# gdb prog※ prog はデバッグ対象のプログラム。gdbはターゲット環境用のもの。
(gdb) target remote x.x.x.x:5555※ x.x.x.x は ターゲットマシンのIPアドレス。
あまりgdbを使いこなしてはいないんだけど、最低限これだけ知っておけばデバッグできるだろうコマンド。
あとは、emacs上からgdbを使うとソースとの関連付けが劇的にわかりやすくなるのでオススメだけど、これについては別の機会に。
- p (print)
- 変数の中身を表示する。p hoge とか、p &hoge とか。簡単な演算もできる。
- display
- 変数の中身を自動的に表示する。display hoge とかやっておくと、プログラムが停止するごとに表示される。
- b (break)
- ブレークポイントを設定する。b hoge.c:123 でhoge.cの123行目。hoge.c:func でhoge.cのfuncと言う関数。関数にはれるのを知っておくと便利。
- c (cont)
- 現在の位置から実行を再開する。次にブレークポイントに達するか、Ctrl + C を押すまで実行する。
- n (next)
- 現在の行を実行する。次の行に移ると止まる。
- s (step)
- 現在の行を実行する。nextと違うのは、関数呼び出しがあると中に入る。
- finish
- 現在の行から、関数を抜けるまで実行する。関数を出ると止まる。
- bt (backtrace)
- スタックフレームのバックトレースを表示する。関数の呼び出し階層を見れる。
- up / down
- スタックフレームを上がる/下がる。呼び出し元のスコープのauto変数を見たりしたいときに。
- l (list)
- ソースを表示する。
- info threads
- スレッド一覧を表示する。
- thread
- スレッドを切り替える。パラメータとして、info threads で得られたスレッドIDを渡す。
あとは、emacs上からgdbを使うとソースとの関連付けが劇的にわかりやすくなるのでオススメだけど、これについては別の機会に。
カテゴリ
プログラミングトラックバック(0)
このブログ記事を参照しているブログ一覧: gdbでリモートデバッグ
このブログ記事に対するトラックバックURL: https://www.wizard-limit.net/cgi-bin/mt/mt-tb.cgi/1185
コメントする