デバッガは、プログラムのデバッグを支援するプログラムであり、作成したプログラムの動作を一時的に停止させて、変数やレジスタの値を確認したり、1行づつ実行させながら処理の流れを確認することができる。 デバッガを利用してプログラムの挙動を把握することは、言語処理系を理解するうえで大きな助けとなる。ここでは、デバッガ活用の基礎として、プログラムのトレース実行の方法を学ぶ。
primeプログラムは、100個の素数を求めるプログラムである。コピーした Debugger フォルダ内の prime フォルダにあるプロジェクトを開いて使用してください。
primeプログラムのソースコードを以下に示す。
includeSrcWithFrame('src/prime/prime.c', 4, "", true, true); ?>
●ソリューションをロードしたのち、ビルド・実行を行い、以下の実行結果が得られることを確認する。2 3 5 7 11 13 17 19 23 29
31 37 41 43 47 53 59 61 67 71
73 79 83 89 97 101 103 107 109 113
127 131 137 139 149 151 157 163 167 173
179 181 191 193 197 199 211 223 227 229
233 239 241 251 257 263 269 271 277 281
283 293 307 311 313 317 331 337 347 349
353 359 367 373 379 383 389 397 401 409
419 421 431 433 439 443 449 457 461 463
467 479 487 491 499 503 509 521 523 541
続行するには何かキーを押してください . . .
ブレークポイントの設定
デバッガ上でプログラム実行時に、一時的にプログラムの停止を行う点をブレークポイントと呼ぶ。
ブレークポイントの設定は,テキストエディタの左端にあるグレーの部分をクリックすることで行う.ブレークポイントは赤丸で表示され,クリックを繰り返すと設定/解除ができる.
<
●ソースコードの任意の場所に、ブレークポイントの挿入・解除を試す.
確認できたら、ソースコードの15行目にブレークポイントを設定する。デバッガ上でのプログラムの実行
ブレークポイントの設定が終了したら、[デバッグ]メニューから[デバッグの開始] をクリックして、プログラムの実行を行う。([F5]キーでも、同様の動作をする。)
上記の操作を行うと、プログラムがロードされ、ブレークポイントが設定された行を実行する直前の状態で停止する。ソースコードエディタ上では、次に実行される行が黄色い矢印で示される。
デバッグを中止するには、[デバッグ]メニューから、[デバッグの停止]をクリックする。
● デバッガ上でプログラムを実行し、矢印が表示されることを確認する。また、デバッグの停止ができることを確認する。
プログラムのトレース
デバッグが開始されると、以下の[デバッグ]ツールバーが表示される。(表示されない場合には メニューの[表示]/[ツールバー]から[デバッグ]にチェックを入れる)
(VS2015)
(VS2019)
プログラムが停止した状態からは、[デバッグ]ツールバーのステップ実行ボタンで一行ずつ実行を進めることができる。以下にデバッグツールバーと、 各ボタンの動作を示す
![]()
ステップ実行 (ステップイン)[F11] 実行を一行すすめる。関数呼出の場合には、関数内部に入る。
![]()
関数単位で実行(ステップオーバー)[F10] 実行を関数単位で実行する。
![]()
関数から抜ける (ステップアウト)(Shift+F11) 現在実行している関数から抜ける。
デバッグが開始されると、以下のようなローカル変数ウインドウが表示される。(デフォルトでは、メインウインドウの左下部にドッキングされて表示される。) 変数ウインドウでは、現在の変数の 値を確認することができる。
([ローカル]ウインドウでは、実行している行のスコープ内にある変数の値を確認することができる。[自動変数]では、使用された変数から順に表示されるので、ローカル変数の数が多いときに利用するとよい。)
変数ウインドウでは、変更のあった変数の値は赤色で表示されるようになっている。
● 実際にステップ実行を行い、各ボタンの動作を確認せよ。また、実行を進めるごとに[変数]ウインドウ内の変数の値が変化することを確かめよ。
ウォッチウインドウでは、名前フィールドに任意の変数や式を入力して、その値がどのように評価されるかを調べることができる。(デフォルトでは、メインウインドウ右下部に表示される。)
● 以下の式がどのように評価されるかまず考えてみてください。次に、ウォッチウインドウの名前フィールドに以下の文字列を入力して、評価結果を確認しなさい。
num
1 / num
2 / 3
(double)2 / 3
(double)(2 / 3)
2 / 3.0
1 / 3 * 6
sizeof (int)
sizeof (char)
sizeof (float)
sizeof (double)
sizeof (num)
- MAXNUM
その他、どのように評価されるのか疑問に思った式を入力して試してみること。デバッガ上では、即座に評価結果が出るので効率がよい。また今後、配列やポインタ、構造体などの式表現を学んだ時には、デバッガ上で評価してどのようになるのかを確認するのが理解の早道です。
※ これらのウインドウが表示されていない場合には,[デバッグ]メニューの[ウインドウ]メニューから対応するウインドウを選んで開くことができる.
sizeof 演算子
型や、変数の大きさ(メモリ上でのバイト数)を返す。その値は実行時ではなく、コンパイル時に定数となることを覚えておくこと。キャスト
(double)2/3 のように、式の前に、型名にカッコをつけたものを書くと、式をその型の値に変換したものを返す。これをキャストという。2/3 では、整数/整数 が実行され、式の値の型も整数となる。(double)2/3 では、2が実数にキャストされ、実数/整数の演算が行われる。式の値も実数型となる。