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

概要

ブレークポイントはVisualStudioなどのIDEで実装されているデバッグ機能です。
この機能を使用することで、素早いバグ調査処理のトレースを可能にします。
今回の説明はVisualStudioで説明を行いますが基本的な機能は
ある程度のIDEには実装されていることが多いので参考になると思います。

debug_0003
debug_0003

ブレークポイントの特性

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

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

ブレークポイントにより処理が一時停止した際に、 宣言されている変数の値を確認することができます。 VisualStudioではマウスカーソルを合わせるだけで値の確認が できるようになっています。 debug_0006 debug_0006 これは「ウォッチ」というデバッグ機能ので別途解説します。

再開

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

設定

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

「F9」を押す

ブレークポイントを設定したい命令文に入力カーソルを移動させます。 debug_0004 debug_0004 この状態でキーボードの「F9」を押すとブレークポイントが設定されます。

画面左端をクリック

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

その他

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

解除

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

キーボードのF9を押す

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

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

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

すべて解除

バグが発生した際など数多く設定しますが、バグの原因を見つけた後は それらのブレークポイントをすべて解除しなければいけません。 debug_0007 debug_0007 すべて解除は「Ctrl + Shift + F9」を押すとポップアップが表示されます。 debug_0008 debug_0008 ここで「はい」を選択すると設定されている全てのブレークポイントが解除されます。 debug_0009 debug_0009 この方法は別ファイルに設定されている全てのブレークポイントが 対象となりますので注意してください。

ステップ実行

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

ステップオーバー

「ステップオーバー」は「F10」を押すことで実行されるステップ機能で、 停止中のブレークポイントの命令を1つだけ実行し、命令完了後は矢印が移動します。 debug_0011 debug_0011 ステップオーバーではステップする予定の命令文が関数の場合でも ブレークポイントを設定している関数上で次の命令文に移動します。 debug_0012 debug_0012

ステップイン

「ステップイン」は「F11」を押すことで実行されるステップ機能で、 停止中のブレークポイントの命令を1つだけ実行し、命令完了後は矢印が移動します。 debug_0013 debug_0013 ステップインではステップする予定の命令文が関数だった場合、 関数にジャンプして処理を進めることができます。 debug_0014 debug_0014

ステップアウト

「ステップアウト」は「Shift + F11」を押すことで実行されるステップ機能で 停止中の命令文の場所の関数の処理をすべて終了させることができます。 debug_0015 debug_0015 関数内の処理をすべて終了させるので、呼び出しもとに戻ります。 debug_0016 debug_0016 ただし、関数内に別のブレークポイントがあればそこで停止する可能性があります。 debug_0017 debug_0017

ブレークポイントの例

ブレークポイントはプログラム実行時に処理がうまく動かない場合や
処理の流れが理解しづらい際に使用します。
今回は処理がうまく動かない場合の簡単な流れを解説します。

⓪.コード

以下のコードを使用してブレークポイントの使い方を解説します。 ※inclucdeはされているものとします。 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 debug_0018

③.再実行する

ブレークポイントを設定したら再度実行します。 その結果、設定した場所で動作が止まるのでsumの値がどうなってるかを確認します。 debug_0019 debug_0019 sumの値はきちんと「0.5」になっているのでバグの原因は 「表示方法がおかしい」の可能性が高くなりました。

④.コードを再確認する

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

⑤.修正して再実行

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

注意点

ブレークポイントや停止時の値の確認機能のウォッチなどはデバッグ機能なので
Release設定で実行した場合は正常に動作しません。
もし、ブレークポイントで停止した場所が設定した場所とずれる、
停止してから値を確認しようとしても見れない、変な値になっている場合は
上段メニューの設定が「Release」になっていないかを確認して、
ReleaseならばDebugに戻してください。

debug_0022
debug_0022