OnlineGDB

マシンにインストールしなくても、ブラウザ上で利用可能なプログラミング&デバッグ環境の一つとして、OnlineGDBの使い方を紹介します。 プログラムを実行するだけでなく、デバッガ上で動作させることもできるのが特徴です。

起動

OnlineGDBのページにアクセスしてみましょう。

  • 右上にプログラミング言語を選択する欄があるので、C なり C++ なり、利用するプログラミング言語を選択してください。
    • この段階で、Hello World 相当のプログラムが準備されます。
  • 「Run」コマンドで実行できます。
  • “main.c(pp)“を編集する形でプログラムを作りましょう。コピー&ペーストしてもらってもいいですが。
    • 作成したプログラムを保存することも、load することもできます。

onlineGDB.png

標準入出力

  • 画面下側の “Standard Input” で、Interactive Console を選ぶと、Console 上で入力を与え、出力が確認できます。
  • Standard Input: Text を選ぶと、固定のテキスト文面を、標準入力として使えます。デバッグに入力を毎回与えるのは結構面倒なので、とっても便利。
    • 標準出力は stdoutOutput タブで、標準エラー出力は stderr で確認できます。
    • デバッグ中に変更しても反映されないようなので、一度上部のStopボタンを押してから変更しましょう。

デバッグ

1個実際にプログラムのデバッグをしてみましょう。

以下で用いる例は、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

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

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

デバッガ起動

デバッグ実行には、画面上の Debug ボタンを選びます。

プログラムを特定の行で停止したい場合は、行番号のところをクリックして、ブレークポイントを指定できます。

debug.png

画面下側に Debug Console が現れます。

  • start: デバッグ開始
  • continue: 再開(ブレークポイントまで進む)
  • step over: 一行実行(関数があっても次の行に)
  • step into: 一行実行(関数があったら、関数の中の行に)
  • step out: 実行中の関数を完了し、呼び出し側に
  • 他のデバッガとちょっとアイコンが違うのでご注意を

右側には、変数の情報などが見えます。

プログラム開始

まず、main 関数にブレークポイントを設定した状態で、 startボタンを実行です。 6行目で止まりました。変数の値もバラバラです。

1行実行

プログラムを一行進めてみましょう。step over ボタンを押してください。

  • プログラムが一行進み(6行目を実行し、次は7行目)
  • 変数 result の初期化がおこなわれる。

もう一行実行させましょう。

  • 7行目が終わって、8行目に進み
  • 局所変数 i も現れ、値は 0 に(現れるのは、前の行かも)

同様に、何回か実行すると、ループを一回分終了して、

  • 次は、7行目

という状態に戻ります。ここまで、多分、意図しない挙動は見えなかったんじゃないでしょうか?

ただ、あと、2行ほど実行すると、多分、「あれ」って状況を目撃するはずです。

補足:

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

Tips

大域変数の表示

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

でも、代わりにexpression に、指定した式の内容を表示できますので、そちらを使いましょう。