The Geek Stuff

How to Debug C Program using gdb in 5 Simple Steps - The Geek Stuffにおいてgdbを使ったCプログラムの基本的なデバッグ方法が紹介されている。あらかじめ問題を仕込んである短いCのソースコードと、それをデバッグオプション付きでビルドして、実際にどのようにデバッグを実施すればいいかが簡潔にまとまっていて参考になる。同記事では次のようなCで記述したソースコードを用意。

階乗計算プログラムをデバッグする例

このソースコードは階乗を計算するという内容。「for (i = 1; i < num; i++) j = j * i」の部分が階乗計算部分だが、変数jが初期化されていないため階乗の計算になっていない。jにどういった数値が入っているかは実行する環境によって左右される。How to Debug C Program using gdb in 5 Simple Stepsでは階乗計算が実施される前の段階にブレークポイントを設定して変数の内容を表示させ、jを適切な値に初期化することを忘れていることを発見するというストーリーで使い方を紹介している。

#include <stdio.h>

int
main()
{
    int     i, num, j;
    printf("Enter the number: ");
    scanf("%d", &num);

    for (i = 1; i < num; i++)
        j = j * i;

    printf("The factorial of %d is %d\n", num, j);
}

実際の処理の流れを上の画像に、基本的なコマンドと操作方法を次にまとめておく。

コマンド 内容
gcc -g コンパイル時に-gを指定する。コンパイル後のバイナリにデバック情報が埋め込まれるため、デバッグが簡単になる。
gdb command コンパイルしたコマンドを指定してデバッガgdbを実行する。
gdbの基本的なコマンド 内容
run プログラムを実行する。
break 行数 指定した行でプログラムの実行を停止するようにする(ブレークポイントの設定)。デバッグするにあたってもっとも基本となる方法。
list ソースコードを表示する。行数を指定することもできる。
print 変数 変数の内容を出力する。デバッグするにあたってもっとも基本となる方法。
c 次のブレークポイントまで実行する。
n 次の1行を実行する。関数は1つの処理として実行する。
s 次の処理を実行する。関数を処理する場合、その関数へ飛んで一つ一つ処理を実施する。