VC++の使い方

VC++の使い方 > チュートリアル > デバッグ入門 > ブレークポイント詳細
このページの内容
詳細・ブレークポイント
位置に対するブレークポイント
条件つきブレークポイント
データに対するブレークポイント
メッセージに対するブレークポイント
ASSERTマクロとの使い分け
ありがたいスポンサー様
All About ソフトウエアエンジニア
ネットで8%割引!自動車保険はアメリカンホーム・ダイレクト
人生の「チャンス」と「ピンチ」にモビット!
保険料が一生上がらない、保険料最大50%割引の一生涯の医療保険!

詳細・ブレークポイント

前回、ブレークポイントを設定する方法を説明しました。このページでは、詳細なブレークポイントの設定方法について解説します。


メニューの 『編集→ブレークポイント』 か Alt + F9 キーを押すと、次のような 『ブレークポイント』ダイアログが表示されます。

ブレークポイントダイアログ
ブレークポイントダイアログ

『ブレークポイント』ダイアログは、『位置』 『データ』 『メッセージ』 の3つのタブと、『ブレークポイント』一覧から成り立っています。ブレークポイントは、それぞれ『位置』 『データ』 『メッセージ』 のいずれかに対するブレークポイントです。前回設定した単純なブレークポイントは、位置に対するブレークポイントでした。では早速、それぞれのブレークポイントについて見ていきましょう。

位置に対するブレークポイント

位置に対するブレークポイントは、行番号もしくは関数名で指定することができます。行番号で指定する方法は、ソースを編集しているうちに行番号が変更になる可能性があるのであまり推奨されていませんが、一時的なテストには便利でしょう。

行番号でブレークポイントを設定するには、次のような方法があります。

これが前回紹介した方法ですね。ここでは 『ブレークポイント』 ダイアログで設定する方法も紹介しましょう。

行番号を設定
行番号を設定

100行目なら、『この位置で停止』 には.100と表示されます。これが 100行目にブレークポイントを設定するということを意味します。

さて、ブレークポイントを設定したあとに、再び 『ブレークポイント』 ダイアログを開いてみましょう。次のように、きちんとファイル名も含んだ形でブレークポイントとして設定されていますね。右向き三角のボタンをクリックして、『詳細設定』 をクリックしてみてください。次のように表示されます。

『詳細設定』 の内容
『詳細設定』 の内容

『コピー元ファイル』 にソースファイルがしっかり設定されています。行番号とコピー元ファイルをVC++が解釈できる構文に変換したのが 『この位置で停止』 に記述されている

{,C:\My Program\debug_test.cpp,} .21

という文字列です。この文字列の詳細な記法に関しては、MSDNを 『ブレークポイントの位置を詳細に指定するための構文』 で検索すれば出てきます。


関数名でブレークポイントを設定するには次のような方法があります。ただし、関数でブレークポイントを設定した場合は、赤い丸が表示されないことに注意してください。

次のような方法もあります。

『ブレークポイント』 ダイアログで設定するには次のようにします。

関数で指定したブレークポイントは、ファイル名を指定する必要はありません。関数名は1つのプロジェクト中で同じものはないので、ファイル名を指定する必要はないんですね。

条件つきブレークポイント

ブレークポイントが設定された場所に処理がくると必ず中断しますが、特定の条件を満たすときにだけ止まるブレークポイントも作成できます。これを実現するには条件を設定すると便利です。

位置で設定したブレークポイントに条件を設定するには、『ブレークポイント』 ダイアログで、条件を設定ブレークポイントを選択して、位置タブの 『条件』 ボタンをクリックしてください。次のようなダイアログが表示されます。

『ブレークポイントの条件』 ダイアログ
『ブレークポイントの条件』 ダイアログ


『評価される式』 に変数や計算式を入力すると、値が変化したときに停止します。条件式を入力すると、評価の結果が真のときに停止します。変数式の例としては、

などがあります。1つ目、2つ目は、x や array[4] の値が変化した場合に停止します。3つ目は、ポインタpの差す値が変化したときに停止します。4つ目は、a+bが変化したときに停止します。条件式の例としては、次のようなものがあります。

1つめは、xが 3 のときに停止します。2つめは、xが 3 よりも大きいときに停止します。そのままですね。


『配列または構造体の要素数』 では 『評価される式』 に入力した変数が配列のときに、いくつの要素をチェックするかを指定できます。『評価される式』 が条件式の場合は、要素数を指定できません。例えば、

『評価される式』:array[0]『要素数』:5

のときは、array[0]からarray[4]のうちのいずれかが変化したときに停止します。『評価される式』にarray[0]と入力するところに注意してください。例えば、

『評価される式』:array[5]『要素数』:5

と入力すると、array[5]からarray[9]のうちのいずれかが変化したときに停止することになります。また、『要素数』 には変数や#defineで定義した値を使うことができないことに注意してください。


『スキップカウント』 はループの中にブレークポイントを設定するときに便利です。スキップカウントは、『評価される式』 が入力されていない場合か条件式の場合に入力できます。例えば、『スキップカウント』 に10と入力すると、11回目にブレークポイントの行を処理するときに停止します。『評価される式』 に条件式が設定してある場合は、条件を11回目に満たしたときに停止します。

『スキップカウント』 のさらに便利なところは、デバッグ中に 『ブレークポイント』 ダイアログを表示すると、スキップカウントの残数を表示してくれます。例として、MSDNの 『ある関数が何回も呼び出される場合、どの呼び出しでエラーが発生するのかを調べるには』 に書いてある例を取り上げます。何度も呼び出される関数が、何回目かに呼び出されたときにエラーが出るかを知りたい場合があります。この場合、スキップカウントに1000ぐらいの大きい数を設定します。次にプログラムを実行して、エラーが起こるのを待ちます。エラーが起こったら 『ブレークポイント』 ダイアログを開いてブレークポイントの一覧を調べます。

スキップ 1000回(750残数)

となっていると、エラーが起こるまでにブレークポイントが 250 回スキップされたことがわかります。『スキップカウント数』 を 250 にして再びプログラムを実行すると、エラーの原因の直前でプログラムは停止します。

データに対するブレークポイント

データに対するブレークポイントは、『ブレークポイント』 ダイアログの 『データ』 タブで作成できます。『評価する式を入力してください』 の右にある3角印のボタンをクリックして、『詳細設定』 を選択します。すると、『ブレークポイントの詳細設定』 ダイアログが表示されます。

『式』 には、変数名や条件式を入力してください。処理方法は条件つきブレークポイントと同じです。コンテキストの中の 『関数』『ソース ファイル』『実行可能ファイル』 は必要ときに入力します。例えば、別のソースファイルの行番号にブレークポイントを設定するにはソースファイルだけを指定します。DLL にブレークポイントを設定するには関数、ソース ファイル、DLL を指定します。DLL ファイル名は 『実行可能ファイル』 フィールドに入力します。

メッセージに対するブレークポイント

データに対するブレークポイントは、『ブレークポイント』 ダイアログの 『メッセージ』 タブで作成できます。ウインドウプロシージャをデバッグしたいときに便利でしょう。

『ブレークポイント』 ダイアログのメッセージタブ
『ブレークポイント』 ダイアログのメッセージタブ

ASSERTマクロとの使い分け

ブレークポイントは便利ですが、条件つきブレークポイントは、ASSERTマクロとほぼ同じ機能と捉えて問題ないでしょう。

ブレークポイントの方が気軽に利用できるうえ、ASSERTマクロでは面倒な機能もあります。例えば、スキップカウント数を設定したブレークポイントばASSERTマクロでは実現しにくい機能です。また、設定データに対するブレークポイントは、実行ファイル全体でデータが変更されたときにプログラムが停止するという利点があります。

しかし、ブレークポイントには弱点があります。GUI で設定するためマウスをさわらなければならなかったり、コードを編集するうちにブレークポイントが消えてしまったりします。

そのため、一時的なデバッグの場合にはブレークポイントを積極的に利用した方が便利ですが、エラーチェックなどの重要な処理にはASSERTマクロを使用した方が良いでしょう。そもそも、ブレークポイントはデバッグ用、ASSERTマクロはエラー処理用という意味で用意されているんでしたね。


最後に、参考文献を紹介しておきます。今回はMSDNの 『Visual C++ドキュメント → Visual C++ ユーザーズガイド → Visual C++ プログラマーズガイド → デバッグ → デバッグ技術、およびデバッグにおける問題と解決法 → ツールとヒント → ブレークポイントの使い方 : 追加情報』 を参考にしました。