gdbすごい

GDBハンドブック

GDBハンドブック

Lua + C言語でアプリケーションを作ってたりするのですが、今までちゃんと使った事のなかったgdbを使ってみたら、かなり便利で作業もはかどってうれしい感じです。
まあ、GDBハンドブックのよく使うコマンドって所を読んで適当に動かしてただけなんですが。それでもデバッグがはかどるはかどる。そんな感じのメモです。
環境: WindowsXP SP3 / MinGW + MSYS

アプリケーションをデバッグシンボル付きでコンパイルする

デバッグシンボル付けないと動かせない……はずなのでそういう風にコンパイルします。
今まで、Makefileには-s -O2とか書いてあったのでそれを消しました。最適化とかstripされると困るので。

#CFLAGS = -Wall -Wextra -pedantic-errors -std=c99 -s -O2
CFLAGS = -Wall -Wextra -pedantic-errors -std=c99 -g
.SUFFIXES: .c .o
.c.o:
	$(CC) $< -o $@ -c $(CFLAGS)
# あとなんかいろいろ

アプリケーションをgdbで起動する

デバッグするアプリケーションを渡してgdbを起動させます。

$ gdb main.exe

gdbの簡易な使い方

GDBハンドブック 7.10 よく使用するコマンド」にあるよりも少ないコマンドだけれど、実際この程度でも大丈夫かも。

コマンド名 ショートカット 機能
break b ブレークポイントの指定
continue cont 処理の継続
next n いわゆるステップオーバー
print p 変数の値などの表示
quit q 終了
run r アプリケーションの実行
step s いわゆるステップイン

これだけわかればそんなに困らないかな……

#include <windows.h>

static int add(int a, int b)
{
  return a + b;
}

int main(void)
{
  int i = 0;

  i = add(1, 2);
  i = add(2, 4);

  return 0;
}

こんな感じのソースコードデバッグ(する必要も無いような気がするけど)するとなると

  1. b main # main関数にブレークポイント
  2. r # 実行
  3. s... # 何度か進んでいく
  4. p i # 変数iの値を表示
  5. s... # もしくはnとかcont

こんな感じで進める。プロンプトに戻ってきたら"q"で終了。
数個のコマンドでこれだけ出来るし、しかも端末内なのでいろいろなところで使えそうな気がします。
ブレークポイントは"b main"でなくても、add関数が見たい場合は"b add"とか他にも行数で指定できたりも出来るようです。


JavaデバッグEclipseじゃなくてgdbでしたいなー。
でもやっぱり面倒なんだろうなー……