11.2 デバッグライトによるデバッグ

  5.プログラム例2:デバッグ
 プログラムがどこで無限ループに陥っているかを調べるために、下記プログラムのように、while文の中にprintf文を挿入してみました(/* デバッグ用 */のついた行)。

#include <stdio.h>

int main(void){
      int count; /* 奇数の数 */
      int odd;   /* 現在の奇数値 */

      count = 0;
      odd = 1;            /* 奇数の初期値 */
      while(odd != 10){   /* 10になるまで */
            count++;          /* 奇数の数を加算 */
            printf("odd, count = %d, %d\n", odd, count); /* デバッグ用 */
            odd = odd+2;      /* 次の奇数へ */
      }

      printf("count = %d\n", count); /* 奇数の数を表示 */
}
 このプログラムを実行すると、下記のようなデータが画面に延々と流れます。
odd, count = 1, 1
odd, count = 3, 2
odd, count = 5, 3
odd, count = 7, 4
odd, count = 9, 5
odd, count = 11, 6
odd, count = 13, 7
odd, count = 15, 8
odd, count = 17, 9
................
 このように、出力結果が一画面に収まらない場合は、出力リダイレクション(>) を使ってファイルに出力した方が良いでしょう。実行ファイルをa.out、出力するファイルをfileとすれば、
a.out > file
のように実行することにより、ファイル「file」にデータが書き込めます。ここで、注意してほしいのは、上記を実行した場合、大量のデータがfileに書き込まれていく点です。従って、すぐにプログラムを停止(Ctrl+c)させた方が良いでしょう。あとは、fileを(cat, lessコマンドなどで)表示し、解析することができます。
実行結果を見ると、奇数の値が10を超えても処理が続いていることがわかります。そこで、繰り返しの条件をチェックします。条件は「odd != 10」となっています。 printf文の出力結果からもわかるように、oddは奇数であり、偶数の10になることはありません。よって、条件が常に「真」となっていたことがわかります。従って、条件を「odd <= 10」とすれば正常に動作します。