ブレークポイントの使い方

概要

最終更新:2020/02/16

プログラム開発のデバッグで必須となるブレークポイントについて書いた記事です。
この記事は以下の内容を知りたい方に向けて書いています。
  • ブレークポイントとは?
  • ブレークポイントは何ができる?
  • ブレークポイントの使い方は?
  • 実戦でどう使えばいいの?



ブレークポイントとは

ブレークポイントはVisualStudioなどのIDEで実装されているデバッグ機能です。
この機能を使用することで、素早いバグ調査処理のトレースを可能にします。

今回はVisualStudioで説明を行いますが基本的な機能は
ほとんどのIDEに実装されているモノが多いので参考になると思います。

debug_0003

ブレークポイントの特性

ブレークポイントは設定した場所で処理を一時停止させる機能です。
ブレークポイントを設定した状態でプログラムを実行すると
設定した場所に処理が到達した時点でプログラムが一時停止します。
停止中は「宣言されている変数の値をチェック」したり、
「1命令ずつ実行(ステップ実行)」したりすることができます。

宣言されている変数の値をチェック

ブレークポイントにより処理が一時停止した際に、
宣言されている変数の値を確認することができます。
VisualStudioではマウスカーソルを合わせるだけで
値の確認ができるようになっています。

debug_0006

これは「ウォッチ」というデバッグ機能です。
この機能については別途解説します。

再開

ブレークポイントで停止した状態を解除するには再実行を即すキーや
ボタンを押すことで再開することができます。
VisualStudioでは「F5」や「続行ボタン」で再開できます。

debug_0010

設定

設定方法は「F9を押す」「画面の左端をクリックする」があります。
ブレークポイントが設定された行には「」が表示されます。

「F9」を押す

ブレークポイントを設定したい命令文に入力カーソルを移動させます。
	
debug_0004

この状態でキーボードの「F9」を押すとブレークポイントが設定されます。

画面左端をクリック

画面の左端というのは以下の場所を指します。

debug_0005

ブレークポイントを設定したい命令文の書かれている行の左端の
赤枠で囲まれている場所をクリックしたら設定されます。

その他

上段メニューのデバッグ項目に「ブレークポイントの設定/解除」という
項目があり、そちらを選択しても設定、解除が可能ですが、
メニューを表示ではなくショートカットキーの「F9」を使用した方が効率的です。

解除

解除は「F9を押す」と「ブレークポイントをクリックする」があります。
解除が完了すると「」が消えてなくなります。

キーボードのF9を押す

解除したいブレークポイントに入力カーソルを移動させます。
移動後に「F9」を押すと解除できます。

ブレークポイントをクリック

解除したいブレークポイントにマウスカーソルを持っていき、
左クリックをすると解除できます。

すべて解除

バグが発生した際など数多く設定しますが、バグの原因を見つけた後は
それらのブレークポイントをすべて解除しなければいけません。
そういった時に「すべて解除」を行うと楽にブレークポイントを解除できます。

debug_0007

すべて解除は「Ctrl + Shift + F9」でポップアップが表示されます。

debug_0008

「はい」を選択すると全てのブレークポイントが解除されます。

debug_0009

この方法は別ファイルに設定されている全てのブレークポイントが
対象となりますので注意してください。

ステップ実行

ステップ実行はブレークポイントで停止た状態から処理を進める機能のことです。
この機能には「ステップオーバー」「ステップイン」「ステップアウト」があり、
各機能で処理を進める挙動が異なります。

ステップオーバー

ステップオーバー」は「F10」を押すことで実行されるステップ機能で、
停止中のブレークポイントの命令を1つだけ実行し、命令完了後は矢印が移動します。

debug_0011

ステップオーバーではステップする予定の命令文が関数の場合でも
ブレークポイントを設定している関数上で次の命令文に移動します。

debug_0012

ステップイン

ステップイン」は「F11」を押すことで実行されるステップ機能で、
停止中のブレークポイントの命令を1つだけ実行し、命令完了後は矢印が移動します。

debug_0013

ステップインではステップする予定の命令文が関数だった場合、
関数にジャンプして処理を進めることができます。

debug_0014

ステップアウト

ステップアウト」は「Shift + F11」を押すことで
実行されるステップ機能で停止中の命令文の場所の
関数の処理をすべて終了させることができます。

debug_0015

ここで「Shift + F11」を押すと関数内の処理をすべて終了させるので、
呼び出しもとに戻ります。

debug_0016

ただし、関数内に別のブレークポイントがあれば
そこで停止する可能性があります。

debug_0017

ブレークポイントの例

ブレークポイントはプログラム実行時に処理がうまく動かない場合や
処理の流れが理解しづらい際に使用します。
今回は以下のコードで発生した問題をブレークポイントを使用して解決します。

#include <stdio.h>

void main(void)
{
	float a = 10;
	float b = 20;
	float sum = a / b;

	printf("%d", sum);
	getchar();
}

①.実行する

上のコードを実行すると「0」と表示されてしまいます。
実行結果は「0.5」と出力されることを期待しましたが、違った結果になりました。

②.ブレークポイントを置く

今回のコードは変数の除算の結果を変数に格納して、printfで
表示しているだけの単純なコードです。
バグの要因として「変数に格納されている値がおかしい」
「表示方法がおかしい」の2パターンが考えられるので
「printf("%d", sum);」にブレークポイントを設定します。

debug_0018

③.再実行する

ブレークポイントを設定したら再度実行します。
その結果、設定した場所で動作が止まるのでsumの値がどうなってるかを確認します。

debug_0019

sumの値はきちんと「0.5」になっているのでバグの原因は
「表示方法がおかしい」の可能性が高くなりました。

④.コードを再確認する

表示方法がおかしいので「printf("%d", sum);」を確認してみます。
すると、実数型を表示しなければいけないはずなのに「%d」が設定されています。

debug_0020

⑤.修正して再実行

④で確認したバグの原因を修正し、再度実行して結果を確認します。

debug_0021

無事、0.5が出力されているので修正完了です。
このようにブレークポイントを使用し値を確認することで、
バグの要因を絞ることができ、すばやく修正することが可能となります。

注意点

ブレークポイントでは以下の点に注意してください。
  • Releaseでは正常に動作しない
  • 処理が来ないと止まらない

Releaseでは正常に動作しない

ブレークポイントや停止時の値の確認機能のウォッチなどのデバッグ機能は
Release設定で実行した場合は正常に動作しません。
もし、以下のような症状になった場合は「Release」になっている可能性があるので
ReleaseになっていればDebugに戻してください。

停止した場所が設定した場所とずれる
停止してから値を確認しようとしても見れない
変な値になっている
debug_0022

処理が来ないと止まらない

ブレークポイントは処理がブレークポイントを設置した位置に来た際に停止します。
なので、以下のケースのようなブレークポイントを設置した場所に来ない流れでは
処理が停止しないのでで注意してください。

debug_0028

ブレークポイントを設置した場所はif文の中です。
このブレークポイントが動作するのはifの条件が成立した場合だけで、
成立しなかった場合は停止しません。