この章の概要です。
ブレークポイントは、デバッグの方法の1つとして、非常に基本的かつ重要な機能です。
ブレークポイントは、ソースコードの任意の「行」に対して設定します。デバッグ実行中、ブレークポイントが設定されている行に実行が差し掛かると、その場で実行を一時停止し、各種デバッグ機能を使える状態で待機します。
ブレークポイントが機能するのは、デバッグ実行時だけです。デバッグなし実行では無視されます。
【上級】ソースコード上ではなく、メモリ位置に対してブレークポイントを仕掛ける、データブレークポイントという機能もありますが、一般的に単にブレークポイントといったときには、ソースコード上に仕掛けるものを指すことが多いです。このページでは、ソースコード上に仕掛けるブレークポイントを説明します。
ブレークポイントを使うと、そのコードが確かに実行されていることを確認したり、そのタイミングで各変数の値がどうなっているかを確認したりといったことができます。
ブレークポイントを使うには、ソースファイルの左端にあるライン上をクリックします。次の写真で、赤枠で囲まれた範囲で、ブレークポイントを設定したい行のところをクリックしてください。あるいは、ソースファイル内にカーソルがある状態で、F9キーを押すことでも設定されます。
ブレークポイントを設定した状態でデバッグ実行を行うと、その箇所で一時停止します。
赤丸で囲ったところに、右向きの黄色い矢印が表示されていますが、この位置で実行が一時停止していることを示しています(正しくいえば、「次に実行されるのはここである」という意味です)。実行結果を表示するウィンドウも同時に表示できています。
一時停止を解除して、続きを実行させるには、【続行】をクリックするか、F5キーを押します。
設定したブレークポイントを削除する操作は、設定するときと同じです。左端にあるライン上についた赤い丸印をクリックするか、行内にカーソルを置いた状態で F9キーで削除できます。
また、メニューバーの【デバッグ】>【すべてのブレークポイントの削除】を選択するか、ショートカットキーの Ctrl + Shift + F9キーを押すと、設定済みのすべてのブレークポイントをまとめて削除できます。削除前に確認されます。
削除するのではなく、無効にしておくという選択もあります。左端にあるライン上についた赤い丸印を右クリックし、【ブレークポイントの無効化】を選択するか、行内にカーソルを置いた状態で、Ctrl + F9キーを押します。有効に戻る操作も同じです。
無効にすると、赤い丸印が塗りつぶされていない状態になります。
削除せずに無効化しておくと、後述する【ブレークポイント】ウィンドウ内に設定情報が残るので、後で復元するのが簡単になります。
また、メニューバーの【デバッグ】>【すべてのブレークポイントの無効化】を選択すると、設定済みのすべてのブレークポイントをまとめて無効化できます。
設定済みのブレークポイントの一覧を、【ブレークポイント】ウィンドウで確認できます。また、ここから各種の操作を行えます。
【ブレークポイント】ウィンドウは、メニューバーの【デバッグ】>【ウィンドウ】>【ブレークポイント】を選択すると表示されます。ショートカットキーは、Ctrl + Alt + B または、Alt + F9キーです。
【ブレークポイント】ウィンドウには、有効・無効を問わず、設定されているブレークポイントがすべて一覧表示されています。
左端のチェックを付け外しすると、そのブレークポイントの有効・無効の状態を切り替えられます。
ダブルクリックすると、そのブレークポイントが設定されているソース位置へ移動できます。
普通にブレークポイントを設定すると、実行がその位置に差し掛かれば必ず停止しますが、場合によっては、もう少し停止条件を絞った方が便利なことがあります。
ブレークポイントの赤い丸印を右クリックして、【条件】を選択すると、次のような条件設定のための画面が表示されます。あるいは、【ブレークポイント】ウィンドウで右クリックして、【設定】を選択して、同じ機能をもった画面を表示できます。
左側のリストから、【条件式】【ヒットカウント】【フィルタ】のいずれかを選択できます。
【条件式】を選択した場合、右隣のリストから【true の場合】【変更された場合】のいずれかを選択できます。
【true の場合】を選んだ場合は、さらにその右側の入力欄に入力した式が、真(true) になるときにだけ停止するブレークポイントになります。たとえば、次のプログラムで、printf関数を呼び出している行に、「i == 5」という条件のブレークポイントを設定します。
#include <stdio.h>
int main(void)
{
for (int i = 0; i < 10; ++i) {
("%d\n", i); // ここにブレークポイントを設定
printf}
return 0;
}
すると、変数 i の値が 0~4 のときと、6~9 のときには停止せず、5 のときにだけ停止するブレークポイントが機能します。デバッグ実行した結果は次のようになります。
【変更された場合】を選んだ場合は、さらにその右側の入力欄に入力した変数の値が変化したときにだけ停止するブレークポイントになります。たとえば、次のプログラムで、変数 x に代入している行に、「x」という条件のブレークポイントを設定します。
#include <stdio.h>
int main(void)
{
int x = 0;
for (int i = 0; i < 10; ++i) {
= i / 3; // ここにブレークポイントを設定
x ("%d %d\n", i, x);
printf}
return 0;
}
変数 x の値は最初は 0 で、その後はループのたびに 0, 0, 0, 1, 1, 1, 2, 2・・・と変化します。そのためまず、0 から 1 に変化するときに停止します。そのあとも、1 から 2 になるとき、2 から 3 になるときに停止します。デバッグ実行した結果は次のようになります。
【ヒットカウント】を選択した場合、右隣のリストから【=】、【の倍数の】、【>=】が選択できます。
ヒットカウントは、そのブレークポイントの位置に実行が何度差し掛かったかをカウントするものです。たとえば、このリストで【=】を選択し、その右側の入力欄に「3」と入力すれば、そのブレークポイントの位置に3回目に到達したときにだけ停止します。
【の倍数の】であれば、右側の入力欄が「3」なら、3回目、6回目、9回目…のときにだけ停止します。
【>=】であれば、右側の入力欄が「3」なら、3回目以降はずっと停止します。
【フィルタ】を選択した場合、右隣のリストには【true の場合】しかありません。条件はさらに右側の入力欄で指定します。
この機能は少し高度なものです。特定のデバイス(PC など)で実行した場合にだけ停止させるだとか、特定のプロセスやスレッドが、コード位置に差し掛かったときにだけ停止させるといったことができます。
指定は、次のいずれかの形で行います。これらを &、||、! で結合できます。
“name” のところは、デバイスやプロセス、スレッドの名前を “” で囲んで指定します。value は、プロセスやスレッドの ID です。
ブレークポイントには、停止させるだけではなく、【出力】ウィンドウに情報を出力するという機能(アクション)を持たせることができます。このようなブレークポイントを、トレースポイントと呼びます。
ブレークポイントの赤い丸印を右クリックして、【操作】を選択すると、設定のための画面が表示されます。あるいは、【ブレークポイント】ウィンドウで右クリックして、【設定】を選択して、同じ機能をもった画面を表示できます。
【出力ウィンドウにメッセージを記録する】の入力欄に、メッセージを入力します。入力例が書かれていますが、{x} といったふうに { } で囲むと、変数や式の値を使うことができます。そのほか、次のキーワードを使って、特殊な情報を埋め込むことができます。
キーワード | 内容 |
---|---|
$ADDRESS | 現在のコード位置のアドレス |
$CALLER | 現在の関数を呼び出した関数の名前 |
$CALLSTACK | 呼び出し履歴 |
$FUNCTION | 現在の関数の名前 |
$PID | プロセスID |
$PNAME | プロセス名 |
$TID | スレッドID |
$TNAME | スレッド名 |
$TICK | ティック数 (WindowsAPI の GetTickCount関数によって取得される値) |
【実行を続行する】のチェックが入っている場合は、プログラムの実行を停止させずに、【出力】ウィンドウへの出力だけを行います。
新規作成。
Programming Place Plus のトップページへ
はてなブックマーク に保存 | Pocket に保存 | Facebook でシェア |
X で ポスト/フォロー | LINE で送る | noteで書く |
RSS | 管理者情報 | プライバシーポリシー |