デバッガの利用 〜トレースから変数のウォッチまで〜

デバッガとは

デバッガは、プログラムのデバッグを支援するプログラムであり、作成したプログラムの動作を一時的に停止させて、変数やレジスタの値を確認したり、1行づつ実行させながら処理の流れを確認することができる。 デバッガを利用してプログラムの挙動を把握することは、言語処理系を理解するうえで大きな助けとなる。ここでは、デバッガ活用の基礎として、プログラムのトレース実行の方法を学ぶ。

今回の演習で使用するプログラムは、P:\月川\2004年度授業資料\演習I\debugger に置いてあるので、ホームドライブ上の任意の位置に、フォルダごとコピーして使用すること。

※注意)コピーしたファイルをVisual C++で開く際には、かならずZドライブからのパスで開くこと。マイコンピュータからのパスでプロジェクトを開くと、デバッガが動作しない。

primeプログラム

primeプログラムは、100個の素数を求めるプログラムである。debugger\prime フォルダのプロジェクトファイル prime.dsw をVisual C++ 開発環境で開く。([ファイル]メニューの[ワークスペースを開く]から prime.dsw を指定するか、エクスプローラから prime.dsw をダブルクリックする。)

primeプログラムのソースコードを以下に示す。

 

ワークスペースをロードしたのち、ビルドを行い、以下の実行結果が得られることを確認せよ。

     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
Press any key to continue

プログラムのトレース

ブレークポイントの設定

デバッガ上でプログラム実行時に、一時的にプログラムの停止を行う点をブレークポイントと呼ぶ。プレークポイントの挿入と解除は、ソースコードのブレークポイントを設定したい場所にカーソルを置き、[ビルド]ツールバーの[ブレークポイントの挿入と解除]ボタンをクリックすることにより行う。(F9キーでも同様の動作をする。)

(必要なツールバーが表示されていない場合には、ツールバー領域の空いている場所で右クリックし、表示されたコンテキストメニューから表示したいツールバーを選択すること。)

プレークポイントの設定状態は、ソースコードエディタの左側に表示される丸印によって確認できる。

ソースコードの任意の場所にカーソルを置き、ブレークポイントの挿入・解除を試しなさい。
確認できたら、ソースコードの15行目にブレークポイントを設定する。

デバッガ上でのプログラムの実行

ブレークポイントの設定が終了したら、[ビルド]メニューから[デバッグの開始]、[デバッグの実行]をクリックして、プログラムの実行を行う。(ビルドツールバーの[実行]ボタン、あるいは[F5]キーでも、同様の動作をする。)

上記の操作を行うと、プログラムがロードされ、ブレークポイントが設定された行を実行する直前の状態で停止する。ソースコードエディタ上では、次に実行される行が黄色い矢印で示される。

デバッグを中止するには、[デバッグ]メニューから、[デバッグの停止]をクリックする。

デバッガ上でプログラムを実行し、矢印が表示されることを確認する。また、デバッグの停止ができることを確認する。

プログラムのトレース

デバッグが開始されると、以下の[デバッグ]ツールバーが表示される。

プログラムが停止した状態からは、[デバッグ]ツールバーのステップ実行ボタンで一行ずつ実行を進めることができる。以下にデバッグツールバーと、 各ボタンの動作を示す

次のブレークポイントまで一気に実行する場合には、プロジェクトツールバー内の実行ボタンを押せば良い。

変数ウインドウ

デバッグが開始されると、以下のような[変数]ウインドウが表示される。(デフォルトでは、メインウインドウの左下部にドッキングされて表示される。) 変数ウインドウでは、現在の変数の状態を確認することができる。

(変数ウインドウの[ローカル]タブでは、実行している行のスコープ内にある変数の値を確認することができる。[自動]タブでは、使用された変数から順に表示されるので、ローカル変数の数が多いときに利用するとよい。また、[this]タブでは、C++のクラスを使用したときに、実行しているメンバ関数の属するクラスのメンバ変数が表示される。)

変数ウインドウでは、変更のあった変数の値は赤色で表示されるようになっている。

実際にステップ実行を行い、各ボタンの動作を確認せよ。また、実行を進めるごとに[変数]ウインドウ内の変数の値が変化することを確かめよ。

ウォッチウインドウと式の評価

ウォッチウインドウでは、シンボル名フィールドに任意の変数や式を入力して、その値がどのように評価されるかを調べることができる。(デフォルトでは、メインウインドウ右下部に表示される。)

ウォッチウインドウのシンボル名フィールドに以下の文字列を入力して、値がどのように評価されるかを調べなさい。

その他、どのように評価されるのか疑問に思った式を入力して試してみること。デバッガ上では、即座に評価結果が出るので効率がよい。また今後、配列やポインタ、構造体などの式表現を学んだ時には、デバッガ上で評価してどのようになるのかを確認するのが理解の早道である。

 

sizeof 演算子
型や、変数の大きさ(メモリ上でのバイト数)を返す。その値は実行時ではなく、コンパイル時に定数となることを覚えておくこと。

キャスト
(double)2/3 のように、式の前に、型名にカッコをつけたものを書くと、式をその型の値に変換したものを返す。これをキャストという。

2/3 では、整数/整数 が実行され、式の値の型も整数となる。(double)2/3 では、2が実数にキャストされ、実数/整数の演算が行われる。式の値も実数型となる。