Qt Creatorを用いたプログラミング(2)「デバッグ」

はじめに

ここでは福井大学の情報基盤センター端末室にあるPCを使用する場合の、 Qt Creatorを用いたC言語プログラミングにおけるデバッグの方法について説明します。


デバッガーを用いたデバッグ

デバッグとはプログラムの不具合(バグ)を修正することです。
Qt Creatorではデバッグの手助けをしてくれるデバッガを使えるので、 プログラムを1行ずつ、変数の中身を確認しながら実行することができます。 プログラムを眺めていても不具合を見つけることは難しいので、 実際にプログラムを実行しながら動作を確認することで効率よくデバッグを行うことができます。


ブレークポイントの設置

デバッグを行うときは、プログラムの特定の行で実行を止めて詳しい解析を行います。

サンプルとして以下のコードを入力し実行して下さい。

#include <stdio.h>
int main()
{
    int i,j,k;
    i = 0;
    printf("i = %d\n",i);
    j = i + 1;
    printf("j = %d\n",j);
    k = j + 5;
    printf("k = %d\n",k);
    return 0;
}

実行結果は以下のようになり、i, j, kの値が表示されます。

Highslide JS

ブレークポイントの設置はマウス操作で行います。
5行目の左側をクリックしてブレークポイント(赤丸)を設置できます。
次に左下のをクリックすると、 デバッガが起動してデバッグモードに切り替わり、 プログラムが実行されブレークポイントで処理が止まります。

Highslide JS

ステップ実行

ブレークポイントで処理が止まったら、そこから1行ずつプログラムを実行できます。 これをステップ実行といいます。
デバッグを開始すると下図のように5行目で処理が止まり、右上に変数の値が表示されます。
この状態で(ステップオーバー)をクリックすると、 ステップ実行できます。

Highslide JS

(ステップオーバー) を1回クリックすると5行目が実行され、右上の変数表示のiの値が0になります。
行番号の左の矢印はこれから実行する行を示しています。

Highslide JS

更にステップ実行し、矢印を11行目まで進めると下図のようになります。
左上の変数表示は更新されi, j, kの値が表示されますが、 下の「アプリケーション出力」にはprintfの出力が行われていません。

Highslide JS

ここで(続行)をクリックすると、 printfの出力が行われプログラムが終了します。

これは、printfの出力が実行したときには行われず、データがバッファに貯えられ、 バッファが満杯になったりプログラムが終了したときにまとめて出力されるためです。

Highslide JS

バッファの強制出力

バッファの内容を強制的に出力するためにはfflushを使います。
printfの内容を強制出力する場合はfflush(stdout)を使います。

プログラムを下図のように修正しデバッグを開始します。

Highslide JS

ブレークポイントで処理が止まった後に、ステップ実行すると fflush(stdout)を実行したときに、printfの出力が行われていることがわかります。

Highslide JS

このようにfflushを使うと出力を確認しながらステップ実行ができます。

デバッグの方法

プログラムを作っても大抵の場合は思った通りに動きません。

なのでデバッグはプログラミングにおいてほぼ必須となります。 デバッグで一番重要なのは、変数の内容を確認することです。 上記の例のように特定の行にブレークポイントを設置し、ステップ実行しながら、 変数の値を調べることでバグを特定できることが多いです。

例では1行の実行に (ステップオーバー) を使いましたが、これは実行する行に関数があるときに関数内のステップ実行を行いません。 それに対して(ステップイン)は、 関数内もステップ実行しますので、次に実行する行は別の関数に移ります。 関数から抜ける場合は(ステップアウト) を使います。また、デバッグを中止する場合は (デバッガを終了)を使います。

これらをうまく使いながら、デバッグをしてみて下さい。


主なデバッガの機能一覧

アイコン表示説明
続行実行の再開
デバッガの終了終了
ステップオーバーステップ実行(関数内は実行しない)
ステップインステップ実行(関数内を実行する)
ステップアウト関数の実行から戻る