お仕事で、gdbを使ってクロスプラットフォームのリモートデバッグをやったのでメモ。
gdbについてはマニュアルを見てもらうとして、リモートデバッグの手順を書いてみます。

準備
  • ターゲットマシンと開発ホストがシリアル又はLANで繋がっていること
  • 開発ホストにターゲットマシン用のクロスgdbがインストールされていること
  • ターゲットマシンにgdbserverがインストールされていること
  • 開発ホストにデバッグ対象の実行ファイルとソースがあること(-ggdb つきでコンパイルされていること)
  • ターゲットマシンにデバッグ対象の実行ファイルがあること

手順
  1. ターゲットマシンでデバッグ対象のプログラムとgdbserverを起動する
    • 実行ファイルが直接起動できる場合
    • # gdbserver 0.0.0.0:5555 prog arg...
      
      ※ 5555 の部分は任意のポート番号。(LANの場合。シリアルの場合は、0.0.0.0:5555の代わりにシリアルのデバイスファイル名)
      ※ prog arg... の部分は、デバッグ対象の実行ファイルとコマンドラインパラメータ
    • 実行ファイルが直接起動できない場合
      1. GUI等から実行ファイルを起動する
      2. ps等でデバッグ対象のPIDを調べる
      3. gdbserverを起動する
      4. # gdbserver 0.0.0.0:5555 --attach PID
        
  2. 開発ホストでgdbを起動する
  3. # gdb prog
    
    ※ prog はデバッグ対象のプログラム。gdbはターゲット環境用のもの。
  4. gdb上でリモートデバッグを指示する
  5. (gdb) target remote x.x.x.x:5555
    
    ※ x.x.x.x は ターゲットマシンのIPアドレス。
  6. あとは、普通にgdbとして使えば良い
  7. デバッグをやめるときは detach と入力する。
あまり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を渡す。
gdbは、Enterのみ入力すると基本的には直前のコマンドをもう一度入力されたものとして動作するので、nとかsとかを連続で実行したい場合はEnterのみで良い。

あとは、emacs上からgdbを使うとソースとの関連付けが劇的にわかりやすくなるのでオススメだけど、これについては別の機会に。

カテゴリ

トラックバック(0)

このブログ記事を参照しているブログ一覧: gdbでリモートデバッグ

このブログ記事に対するトラックバックURL: https://www.wizard-limit.net/cgi-bin/mt/mt-tb.cgi/1185

コメントする

このブログ記事について

このページは、falseが2007年6月28日 11:10に書いたブログ記事です。

ひとつ前のブログ記事は「DOS?」です。

次のブログ記事は「MT 4.0」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

広告

Powered by Movable Type 6.1.1