ブレークポイント | Programming Place Plus Visual Studio編

トップページVisual Studio編

この章の概要

この章の概要です。


ブレークポイントを設定する

ブレークポイントは、デバッグの方法の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) {
        printf("%d\n", i);  // ここにブレークポイントを設定
    }

    return 0;
}

すると、変数 i の値が 0~4 のときと、6~9 のときには停止せず、5 のときにだけ停止するブレークポイントが機能します。デバッグ実行した結果は次のようになります。

条件式(true の場合)で停止させる 【変更された場合】を選んだ場合は、さらにその右側の入力欄に入力した変数の値が変化したときにだけ停止するブレークポイントになります。たとえば、次のプログラムで、変数 x に代入している行に、「x」という条件のブレークポイントを設定します。

#include <stdio.h>

int main(void)
{
    int x = 0;
    for (int i = 0; i < 10; ++i) {
        x = i / 3;  // ここにブレークポイントを設定
        printf("%d %d\n", i, x);
    }

    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 など)で実行した場合にだけ停止させるだとか、特定のプロセスやスレッドが、コード位置に差し掛かったときにだけ停止させるといったことができます。

指定は、次のいずれかの形で行います。これらを &、||、! で結合できます。

  • MachineName = “name”
  • ProcessId = value
  • ProcessName = “name”
  • ThreadId = value
  • ThreadName = “name”

“name” のところは、デバイスやプロセス、スレッドの名前を "" で囲んで指定します。value は、プロセスやスレッドの ID です。

アクションを設定する(トレースポイント)

ブレークポイントには、停止させるだけではなく、【出力】ウィンドウに情報を出力するという機能(アクション)を持たせることができます。このようなブレークポイントを、トレースポイントと呼びます。

ブレークポイントの赤い丸印を右クリックして、【操作】を選択すると、設定のための画面が表示されます。あるいは、【ブレークポイント】ウィンドウで右クリックして、【設定】を選択して、同じ機能をもった画面を表示できます。

ブレークポイントのアクションを設定する

【出力ウィンドウにメッセージを記録する】の入力欄に、メッセージを入力します。入力例が書かれていますが、{x} といったふうに { } で囲むと、変数や式の値を使うことができます。そのほか、次のキーワードを使って、特殊な情報を埋め込むことができます。

キーワード 内容
$ADDRESS 現在のコード位置のアドレス
$CALLER 現在の関数を呼び出した関数の名前
$CALLSTACK 呼び出し履歴
$FUNCTION 現在の関数の名前
$PID プロセスID
$PNAME プロセス名
$TID スレッドID
$TNAME スレッド名
$TICK ティック数 (WindowsAPI の GetTickCount関数によって取得される値)

【実行を続行する】のチェックが入っている場合は、プログラムの実行を停止させずに、【出力】ウィンドウへの出力だけを行います。


参考リンク



更新履歴

’2018/9/8 新規作成。



Visual Studio編のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る