その時々

その時々で違うんです。特に決まっていないんです。

gdbデバッガーでCのプログラムをデバッグ

とあるCのプログラムをUbuntuに移植することになりました。
なかなかうまく動かずどこが原因か特定するためgdbを使用しました。

簡単な使用手順です。

まずはコンパイルするときに-gオプションでデバッグ情報を埋め込みます。

gcc -g test.c

といった感じに。
次にgdbを起動します。

gdb test

ここではtestという実行ファイルを読み込んで起動してますが、
gdbを起動したあとにfileコマンドで読み込んでも同じです。

gdb
file /home/aaa/test

まずはブレイクポイントの設定です。
設定例

break main
break 100

1つ目はmain関数にブレイクポイントを設定しました。
2つ目はソースの100行目にブレイクポイントを設定しました。

そうしましたらrunコマンドで実行です。

r

breakポイントで止まるので次のコマンドで進めていきます。

s  STEP実行
n  NEXT実行
c  continue

sは関数があればその関数の中に入っていきますし、nは関数の中には入りません。cは次のブレイクポイントまで実行します。
一度コマンドを入力したら続けてEnterを押せば同じコマンドを繰り替えしてくれます。

途中でソースが見たくなったらlistコマンドで表示できます。

list 200

ソースの200行目を中心として前後10行表示します。
Enterで先に送れます。

変数の内容が見たい場合はprintコマンドです。

p hensuu

変数の内容を常に追跡したい場合はdisplayコマンドです。

display hensuu

あとは、途中で画面をクリアしたくなったらshellコマンドからclearを実行します。

shell clear

途中でshellに入る場合はそのまま引数なしでshellコマンドを実行し、exitでgdbに戻れます。

あとはメモリの内容を表示したい場合はexamineコマンドです。

x アドレス

例: x/8xb 0xffff0011 、 アドレス0xffff0011の中をHEXで8個見せる

  • n 規定値1 、uで指示した単位
       
  • f 表示形式、規定値は16進
       
  • u メモリサイズの単位
       
    • b バイト
            
    • h 2バイト
            
    • w 4バイト(規定値)
            
    • g 8バイト
         

これぐらい使えればいいんじゃないでしょうか。

参考URL
http://www.fireproject.jp/feature/gdb/
http://www.madlabo.com/mad/edat/GDB/index.htm#SEC23