OnlineGDB
マシンにインストールしなくても、ブラウザ上で利用可能なプログラミング&デバッグ環境の一つとして、OnlineGDBの使い方を紹介します。 プログラムを実行するだけでなく、デバッガ上で動作させることもできるのが特徴です。
起動
OnlineGDBのページにアクセスしてみましょう。
- 右上にプログラミング言語を選択する欄があるので、C なり C++ なり、利用するプログラミング言語を選択してください。
- この段階で、Hello World 相当のプログラムが準備されます。
- 「Run」コマンドで実行できます。
- “main.c(pp)“を編集する形でプログラムを作りましょう。コピー&ペーストしてもらってもいいですが。
- 作成したプログラムを保存することも、load することもできます。
標準入出力
- 画面下側の “Standard Input” で、
Interactive Console
を選ぶと、Console 上で入力を与え、出力が確認できます。 - Standard Input:
Text
を選ぶと、固定のテキスト文面を、標準入力として使えます。デバッグに入力を毎回与えるのは結構面倒なので、とっても便利。- 標準出力は
stdout
Output タブで、標準エラー出力は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 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
に、指定した式の内容を表示できますので、そちらを使いましょう。