ブレークポイントの使い方
概要
最終更新:2020/02/16 プログラム開発のデバッグで必須となるブレークポイントについて書いた記事です。 主に次の項目に該当する方に向けて書いています。
- ブレークポイントとは?
- ブレークポイントは何ができる?
- ブレークポイントの使い方は?
- 実戦でどう使えばいいの?
ブレークポイントとは
ブレークポイントはVisualStudioなどのIDEで実装されているデバッグ機能です。 この機能を使用することで、素早いバグ調査や処理のトレースを可能にします。 今回はVisualStudioで説明を行いますが基本的な機能は ほとんどのIDEに実装されているモノが多いので参考になると思います。
ブレークポイントの特性
ブレークポイントは設定した場所で処理を一時停止させる機能です。 ブレークポイントを設定した状態でプログラムを実行すると 設定した場所に処理が到達した時点でプログラムが一時停止します。 停止中は「宣言されている変数の値をチェック」したり、 「1命令ずつ実行(ステップ実行)」したりすることができます。
宣言されている変数の値をチェック
ブレークポイントにより処理が一時停止した際に、 宣言されている変数の値を確認することができます。 VisualStudioではマウスカーソルを合わせるだけで 値の確認ができるようになっています。 これは「ウォッチ」というデバッグ機能です。 この機能については別途解説します。
再開
ブレークポイントで停止した状態を解除するには再実行を即すキーや ボタンを押すことで再開することができます。 VisualStudioでは「F5」や「続行ボタン」で再開できます。
設定
設定方法は「F9を押す」「画面の左端をクリックする」があります。 ブレークポイントが設定された行には「●」が表示されます。
「F9」を押す
ブレークポイントを設定したい命令文に入力カーソルを移動させます。 この状態でキーボードの「F9」を押すとブレークポイントが設定されます。
画面左端をクリック
画面の左端というのは以下の場所を指します。 ブレークポイントを設定したい命令文の書かれている行の左端の 赤枠で囲まれている場所をクリックしたら設定されます。
その他
上段メニューのデバッグ項目に「ブレークポイントの設定/解除」という 項目があり、そちらを選択しても設定、解除が可能ですが、 メニューを表示ではなくショートカットキーの「F9」を使用した方が効率的です。
解除
解除は「F9を押す」と「ブレークポイントをクリックする」があります。 解除が完了すると「●」が消えてなくなります。
キーボードのF9を押す
解除したいブレークポイントに入力カーソルを移動させます。 移動後に「F9」を押すと解除できます。
ブレークポイントをクリック
解除したいブレークポイントにマウスカーソルを持っていき、 左クリックをすると解除できます。
すべて解除
バグが発生した際など数多く設定しますが、バグの原因を見つけた後は それらのブレークポイントをすべて解除しなければいけません。 そういった時に「すべて解除」を行うと楽にブレークポイントを解除できます。 すべて解除は「Ctrl + Shift + F9」でポップアップが表示されます。 「はい」を選択すると全てのブレークポイントが解除されます。 この方法は別ファイルに設定されている全てのブレークポイントが 対象となりますので注意してください。
ステップ実行
ステップ実行はブレークポイントで停止た状態から処理を進める機能のことです。 この機能には「ステップオーバー」「ステップイン」「ステップアウト」があり、 各機能で処理を進める挙動が異なります。
ステップオーバー
「ステップオーバー」は「F10」を押すことで実行されるステップ機能で、 停止中のブレークポイントの命令を1つだけ実行し、命令完了後は矢印が移動します。 ステップオーバーではステップする予定の命令文が関数の場合でも ブレークポイントを設定している関数上で次の命令文に移動します。
ステップイン
「ステップイン」は「F11」を押すことで実行されるステップ機能で、 停止中のブレークポイントの命令を1つだけ実行し、命令完了後は矢印が移動します。 ステップインではステップする予定の命令文が関数だった場合、 関数にジャンプして処理を進めることができます。
ステップアウト
「ステップアウト」は「Shift + F11」を押すことで 実行されるステップ機能で停止中の命令文の場所の 関数の処理をすべて終了させることができます。 ここで「Shift + F11」を押すと関数内の処理をすべて終了させるので、 呼び出しもとに戻ります。 ただし、関数内に別のブレークポイントがあれば そこで停止する可能性があります。
ブレークポイントの例
ブレークポイントはプログラム実行時に処理がうまく動かない場合や
処理の流れが理解しづらい際に使用します。
今回は以下のコードで発生した問題をブレークポイントを使用して解決します。
#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);」にブレークポイントを設定します。
③.再実行する
ブレークポイントを設定したら再度実行します。 その結果、設定した場所で動作が止まるのでsumの値がどうなってるかを確認します。 sumの値はきちんと「0.5」になっているのでバグの原因は 「表示方法がおかしい」の可能性が高くなりました。
④.コードを再確認する
表示方法がおかしいので「printf("%d", sum);」を確認してみます。 すると、実数型を表示しなければいけないはずなのに「%d」が設定されています。
⑤.修正して再実行
④で確認したバグの原因を修正し、再度実行して結果を確認します。 無事、0.5が出力されているので修正完了です。 このようにブレークポイントを使用し値を確認することで、 バグの要因を絞ることができ、すばやく修正することが可能となります。
注意点
ブレークポイントでは以下の点に注意してください。
- Releaseでは正常に動作しない
- 処理が来ないと止まらない
Releaseでは正常に動作しない
ブレークポイントや停止時の値の確認機能のウォッチなどのデバッグ機能は Release設定で実行した場合は正常に動作しません。 もし、以下のような症状になった場合は「Release」になっている可能性があるので ReleaseになっていればDebugに戻してください。
停止した場所が設定した場所とずれる |
停止してから値を確認しようとしても見れない |
変な値になっている |
処理が来ないと止まらない
ブレークポイントは処理がブレークポイントを設置した位置に来た際に停止します。 なので、以下のケースのようなブレークポイントを設置した場所に来ない流れでは 処理が停止しないのでで注意してください。 ブレークポイントを設置した場所はif文の中です。 このブレークポイントが動作するのはifの条件が成立した場合だけで、 成立しなかった場合は停止しません。