少しプログラムが複雑になっただけで、誤りを発見するのはとても困難になります。しかし、デバッガを使いこなすことで、プログラミングはずっと効率的になります。 上級者ほどデバッガの使い方が上手です。プログラミングをする上でデバッガの習得は必須事項だと思ってください。
プログラムの特定の場所で実行を一時中断して、そのときの変数の状態を確認したい場合があります。そのような場合にはブレークポイントが役に立ちます。
プロジェクト名: bp1
まず、上の図と同じプログラムを打ち込んでください。そして、プロジェクトを保存してください。このプログラムは、コンソールウィザードで新規作成してください。
次に、上の図の様に、ソースコードのウインドウの左側をクリックして赤い点を付けます。これがブレークポイントです。ブレークポイントを解除するときは赤い印をクリックします。
それでは、この状態でビルドしたあと&実行してみてください。
実行は、「デバッグ」→「デバッグ開始」か、図のように緑の矢印ボタンをクリックします。
黒い画面が一瞬見えた後(見えないときもあります)、ブレークポイントの位置で実行が一時中断されます。左側の 黄色の矢印が実行が止まっている位置です。
ここで、次の行に実行を進めてみましょう。そのためには、下の図の様にメニューから「ステップ オーバー」を選択するかF10キーを押します。
確かに一つ進みました。
今度は、下の図の位置(c = a + b;の位置)にカーソルを移動して、右クリックし、メニューから、カーソル行の前まで実行を クリックましょう。
下図のように、カーソルのある行まで実行が進みました。
実行時、ブレークポイントで中断しているときは、簡単に変数の内容を見ることが出来ます。
変数の内容を確認するには、変数の上にマウスカーソルを置きます。
左図のように、変数名と値が表示されます。
現在、c = a + b;の直前まで実行されているので、a = 2, b = 3, cには、値が設定されていないのででたらめな数が入っているはずです。各自確かめてください。
デバッグを停止するには、下図のように、「デバッグ」→「デバッグの停止」をクリックするか、デバッグの停止ボタンをクリックします。
ここでは、例題を変えます。まず上の例と同様に、プロジェクトを新規作成して、下図のプログラムを入力してください。そして、 下図のように、ブレークポイントを設定してください。
プロジェクト名: bp2
実行すると、ブレークポイントの位置で中断します。そこからF10キーを押して、下の図の様にしてください。
実行を中断した状態で、変数にカーソルを当てると変数の内容が確認できます。
ここで、F10キーを押すと次の行へ進みますが、sumの中の実行を見たいときがあります。 そんなときは、「ステップ オーバー」ではなく、「ステップ イン」を選択するか、F11キーを押します。
上の図の様に、sumの先頭で実行が中断しました。他のメニューについても各自試してください。
ここでは、bp2を下の図のように変更し、関数sumの中にブレークポイントを設定してください。
このプログラムは、関数sumが関数test1と関数test2から呼ばれます。
関数sumにブレークポイントを設定して実行をとめた時、どこから呼ばれたかを知りたいときがあります。
複雑なプログラムになると、どこから呼ばれたのかを特定するのは難しくなりますが、呼び出し履歴を見るとすぐにわかります。
このプログラムでは、単純でその必要性を実感できないかもしれませんが、 プログラムが複雑になると、ある場所からある関数が呼ばれるとエラーになるという状況が良く起こります。このとき、呼び出し履歴がないと誤りを 見つけるのは殆ど不可能になる場合もあります。よって呼び出し履歴の機能はとても重要です。
コンパイル&実行してsumの中で実行が中断したならば、下の図の様に呼び出し履歴を選択してください。
呼び出し履歴は通常右下にあります。もし、表示されていないときは、「デバッグ」→「ウィンドウ」→「呼び出し履歴」をクリックします。
すると下の図のようなウインドウが出てきます。この意味は下から、__tmainCRTStartup、main、test1、sumの順で関数が呼ばれたことを表します。言い換えると、sumはtest1の中から呼ばれ、test1はmainの中から呼ばれ、mainは__tmainCRTStartupの中から呼ばれたことを表しています。
ところで、__tmainCRTStartupはコンパイルが自動にプログラムにつける関数です。プログラムは、表面上main関数から始まりますが、実は__tmainCRTStartupという関数が、プログラムの始まりの裏方の処理を行っているということが呼び出し履歴を見ると分かります。
そして、更にその下を見ると__tmainCRTStartupは、mainCRTStartup関数から呼ばれています。
また呼び出し履歴の一覧の関数名をクリックすると、次の関数を呼び出した位置を表示することが出来ます。 下図は、test1をクリックしたところです。
一覧は、実行可能プログラム名(bp2.exe)のあとに!マークが続き、そのあとに関数名、引数と続きます。
上図のように、呼び出し履歴の一覧の項目(ここでは、bp2.exe!test1(int x=1, int y=1) ...)をクリックすると、該当する関数のソースコードが表示され、次の関数を呼び出した位置が緑の矢印で表示されます。
次に、F10とF11を適切に使って実行を進めて、プログラムの流れを最後まで確認してください。
ブレークポイントは、その時点でプログラムの実行を止めたいときもありますが、例えば、100回目に止めたいという場合や、ある変数が特定の値になったときだけ止めたい場合もあります。
ブレークポイントには条件を設定することが出来ます。
下図のように設定したいプレークポイントの赤い丸を右クリックします。
メニューが出てくるので、回数を設定するときは「ヒット カウント」をクリックします。
ウィンドウが開きます。
ここでは、2回目で止まるようにしましょう。
左図のように、設定します。OKボタンをクリックしてウィンドウを閉じます。
ブレークポイントのマークが変化しています。
この状態で、プログラムを実行してください。
先ほどと同じようにプログラムは中断されますが、呼び出し履歴を見ると…
上図のように関数sumは関数test2から呼び出されている状態であり、関数sumが2回目に呼び出されている状態であることがわかります。
他のプレークポイントの設定方法は各自確認してください。
以上でデバッガの説明を終わります。
上手く使いこなして、効率よくプログラミングしてください。
デバッガを使いこなすことで、効率を100倍上げることも可能です。