デバッグ編 (VScode, C言語)

デバッグ編 (VScode, C言語)

Target: はじめに

まずは、なにかプログラムを持ってきましょう。

以下で用いる例は、debugTest0.cです。

を計算するつもり(そうはなっていない)のプログラムです。

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int i;
    float result = 0.0;
    for(i = 1; i < 10; i++) {
        float tmp = 1/i;
        result = result + tmp;
    }
    printf("result = %f\n", result);
    fflush(stdout); /* この時点で、出力を強制したければ */
    return 0;
}

動作させると、なぜか、

result = 1.000000

という結果になってしまいます。なぜでしょう?

ってことで、よく分からないものは、デバッガにかけて調べましょう。 (一瞬で答えが分かったという人も、今後に備えて、デバッガの使い方を学びましょう)

Start: デバッガ起動

デバッグ実行の際は、メニューの「デバッグ」→「デバッグの開始」でOKです。

デバッグ用画面になります。

vscCD01_1.png

この画面は、7行目にブレークポイントを入れて、そこで停止したところです。

画面が以下のように分かれています。

Breakpoints: ブレイクポイント設定

ブレイクポイントは、プログラムに止まってほしい場所のことです。

なんてときに使います。

Step: 1行実行

プログラムを一行進めてみましょう。「デバッグ」ウィンドウの、「ステップオーバー」というボタンを押してください。

今止まっているのは、

です。ステップ実行で、一行実行させると、

ループを何度か回ると、変数 tmp の値が、「あれれ?」って感じになるはずです。

補足:

Resume: プログラム再開

プログラムを再開(一行単位でなく、次のブレイクポイントなり終了まで実行)させたいときは、

「続行」アイコンを押しましょう。

ちなみに、11行めのprintf() を実行し終わっても、コンソールに文字出力がでないことがあります。

これは、書き込んだ文字がバッファにたまったママになっているからで、12行目の様に

fflush(stdout);

とかしてやると、きちんと出力されます。

補足:

Call Stack: 関数スタック

こちら を読んで、なんなら課題を解いてみてください。

Tips

Global Variables: 大域変数の表示

局所変数と違い、大域変数一覧は、表示されません。

でも、代わりに「ウォッチ式」にて、指定した式の内容を表示できますので、そちらを使いましょう。 +ボタンを押せば式を追加できるはず。