Cygwinでデバッグ

エラーの出ない場合

デバッグライト

プログラムの動作の詳細を確かめるために、変数の値を表示させるのは、どの言語にも通用する、プリントデバッグと呼ばれる、もっとも基本的な手法です。この変数表示のプリント文のことを「デバッグライト」(debug write) といいます。

デバッグライトには、いくつかコツがあります。

/* 1からn の合計を求める */
int sum(int n) {
    int ret = 1; // 初期値がおかしいのだが...
    for (int i=1; i<=n; i++) {
        ret = ret + i;
        printf("%s: i=%d, ret=%d\n", __func__, i, ret); // デバッグライト
    }
    return ret;
}

このようなプログラムを実行すると、

sum: i=1, ret=2
sum: i=2, ret=4
...

と表示されて、ret の初期値のおかしいことに気付けるでしょう。

メモリの不正アクセスなどでプログラムが中断される場合には、プリントしたはずの文字が表示されないことがよくあります。C言語のライブラリでは、処理の効率化のために、表示する内容は一旦バッファに蓄えてから、あるタイミングでまとめて表示する、といったことがなされています。不正終了した場合は、バッファにたまったまま表示されませんので、対策が必要です。いくつか方法があります。

しかしながら、メモリを破壊しているような場合には、直後に停止するわけでもなく、printf()1つ追加するだけで動作が変わることもありますので、「これが表示されたから、ここまでは正しく動作している」というのがあてにならないこともママあります。


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS