C/C++ デバッグ

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

Target: はじめに

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

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

  • 1/1 + 1/2 + … + 1/9

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

#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行目にブレークポイントを入れて、そこで停止したところです。

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

  • 変数(Variables) を表示する画面
  • watch expression: 指定した式を表示可能。大域変数も表示したければこちらで対応可能
  • Call Stack: 実行中の関数呼び出し状況(呼び出しスタック)表示&選択用(今回は、main のみ)
  • プログラムソース
  • コンソール(実行出力などが表示される, Mac ではデバッグコンソールに表示されるみたい)

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

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

  • まずは main で止まって欲しいとか、
  • 7 行目に来たときは毎回止まってほしい(上の図の例)

なんてときに使います。

  • ブレイクポイントの設定には、ソース画面左端(数字の左側の端っこ)のところをクリックします。赤いマーカーがついたり消えたりするはずです。

Step: 1行実行

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

今止まっているのは、

  • 7 行目に入ったところ(次に、7行目を実行するところ)

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

  • 7行目が終わって、8行目に進み
  • 変数 i が設定/更新されます。

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

補足:

  • 一行実行の際、関数の中まで実行を追いかけたい場合は、ステップインを選択しましょう。
  • 逆に、関数から呼び出し側に抜けたい場合は、ステップオーバーを選択しましょう。

Resume: プログラム再開

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

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

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

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

fflush(stdout);

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

補足:

  • デバッグを終了したい場合は、「終了」ボタンでプログラムを終了しましょう。

Call Stack: 関数スタック

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

Tips

標準入出力

最近は、`Terminal タブから標準入出力を扱うようになっているようです。Debug Console`` ではないので、ご注意を。(2023年8月1日調べ)

といいながら、1年前は Debug Console に出ていたし、ちょこちょこ変わることがあるので、そういう意味でもご注意を。

Global Variables: 大域変数の表示

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

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