こんちゃっす、ダイブツです!
あなたは今までにこんな経験はありませんか?
・プログラムが思った通りに動かず、原因を見つけるのに1時間以上かかってしまった・・・
・効率良くデバッグしたい!
そんなあなたの為に今回伝えるのが、デバッグの3大機能である「ブレークポイント、ウォッチ、ステップ実行を使ったデバッグ」です。
このデバッグ方法を知っているか知っていないかで、バグを見つけ出すスピードが3倍以上(僕の体感で)変わってきます。
なので、ここでしっかりとこのデバッグ方法を身に付けてササッとバグを見つけていきましょう!
デバッグ:プログラム中にあるバグを取り除くこと
目次
もし、ブレークポイントを使わずにデバッグすると・・・?
まずデバッグ3大機能の代表例として、ブレークポイントを使わずにデバッグをするとどうなるか知っておきましょう。
もしブレークポイントを使わずにデバッグすると、「プログラムの実行結果を見ながらプログラムを修正する」という流れになりますよね。
デバッグの準備なんてものは何もいらないので、すごく気軽にできるデバッグになります。
単純なプログラムだったらこのデバッグ方法でも特に問題ありません。
ただですよ!!
これが複雑なプログラムになってくるとまぁ~じで原因が分かんなくなるんです。
現役で8年間プログラムを書いてきた僕の経験からこれは間違いないです。
しかも必ずしもプログラムを見ながら原因を探るわけでもないので、頭の中でプログラムを実行させながら何が悪いか考えるんですよ。
これからあなたは複雑なプログラムを出会っていきます。
そんな時にこんな難しいデバッグ方法で、バグの原因が分かると思いますか?
初心者にとっては、どう考えても無理だと思います。
仮に分かったとしてもめっちゃ時間がかかってしまうかのどちらかですね。
だから僕はあなたにブレークポイントを使ったデバッグ方法を知ってほしいんです。
ブレークポイントを使ったデバッグの最大メリット
ブレークポイントを使ったデバッグとは、CS+等の開発環境に備えられているデバッグ機能を使ってデバッグする、という方法です。
このブレークポイントを使うと、実行途中のプログラムを停止させて、このタイミングでは変数に何の値が入っていただとか、プログラムのありえない箇所に分岐が進んでいってた、なーんてことがわかるようになります。
しかもブレークポイントを使わないデバッグ方法と違って、この方法では目で見て処理がどう進んでいるのかが分かるので、とってもプログラムの動きがわかりやすいんですよ。
後から説明するウォッチウィンドウ、ステップ実行でもプログラムの動きを詳しく追うことができるんです。
だから僕はあなたに3大デバッグ方法を伝授します。
それじゃあ今から説明していきますね。
CS+に備わっている3大デバッグ機能の使い方
CS+でブレークポイントを使うのに、何か特別なソフトのインストールなんていりません。
ちょちょっと、ペペッと設定してしまえばいいだけです。
実際に設定の仕方を見てもらった方が早いので、これから説明する通りにCS+で操作してみてください。
機能1:ブレークポイントの使用方法
最初に、CS+の画面上部にあるメニューから、「デバッグ」→「リビルド&デバッグ・ツールへダウンロード」を押してください。
デバッグができる画面になりましたね。
次に、ブレークポイントを設定していきます。
上の方でもチラッと書きましたが、このブレークポイントを設定することで、止めたいタイミングでプログラムを一時停止させることができるんです。
それで、このブレークポイントを設定するには、下の図のように、プログラムの横にある指差しマークがある行をクリックします。
ここをクリックすることで、クリックした箇所にブレークポイントマークが付きます。
これでブレークポイントの設定は完了です、
このブレークポイントを設定している状態で下の図に書いている緑色の実行ボタンを押してプログラムを実行すると、ブレークポイント行の処理を実行する前にプログラムが一時停止します。
↓緑色の実行ボタンがブレークポイントで停止させる実行ボタン。
逆に白色の実行ボタンだとブレークポイントを設定していてもブレークポイントで停止しません。
↓ブレークポイントで停止すると、停止した行が黄色になる。
一時停止後は、また緑色の実行ボタンを押すことで続きの処理を実行することができるんです。
機能2:ウォッチウィンドウの使用方法
実はブレークポイントで一時停止している間に、今の変数の値を確認することができるんです。
この変数の値を見る画面(ウォッチウィンドウ)についても説明していきます。
まず、一時停止している状態で、変数にマウスポインタを合わせて右クリックしてください。
そうすると下の図のような画面が表示されるので、「ウォッチ1に登録」を選択します。
そうすると、画面の右の方に「ウォッチ1」という内容が表示されます(↓画面参照)。
これがウォッチウィンドウと呼ばれるもので、変数の今の値を表示してくれます。
ここだと変数jの値が0になっているということが分かりますね。
そしてプログラムを実行するにつれて変数の値は変わっていくものです。
それなら、このウォッチウィンドウに表示される値も、処理を進めていくことで自動で変わらないとおかしいですよね?
そうなんです、プログラムを進めていった時の変数の変化が分かるので、このウォッチウィンドウはめっちゃ便利なんです。
これを凝視することでプログラムが今どんな処理をしているか分かるんですね。うーん、ホントに画期的!!
どうやって動作させるかイメージが付きやすいように、GIF動画を撮ったので参考にしてください。
この動画では、こんな順番で操作を行っています。
この内容と動画を照らし合わせると何をやっているかわかるはず!
1、プログラムの実行ボタンを押す。
2、ブレークポイントを設定した箇所でプログラムが一時停止する。
3、実行ボタンを押してfor文を1周ずつ動作させている。
この時、一緒に変数に表示されている値も変わっている。
機能3:ステップ実行の使用方法
ブレークポイントに関わるデバッグ方法としてもう1つ、ステップ実行というものがあります。
これは1行ずつプログラムを実行して、プログラムがどこを通っているか確認する時に使うものです。
このステップ実行についても動画を見てもらった方が使い方が感覚で分かると思います。
↓のように実行ボタンの右の方にあるボタンを押すことで、処理を1つずつ進めることができますよ。
もちろんこの時でもウォッチウィンドウで変数の値を確認することができます!
バグ0を達成するデバッグ手順例
ここからが本番です。
今紹介したデバッグ機能を使って、実際にどうやってデバッグを進めていくか見ていきましょう。
まず、いつものように例を出しますね。
プログラムは以前に繰り返し文の説明記事で使ったものを一部改変したこのプログラムを使います。
#include "r_cg_userdefine.h"
#include "./library/time.h" //wait_1ms()を使えるようにインクルード
#define LED_ON_CYCLE_TIME 500 //LEDの点滅間隔
void main_study(void)
{
int i,j; //繰り返し処理のカウント用変数
// 緑、青LEDを順番にずっと点滅
while(1){
//緑色LEDを点滅
for(j = 0; j <= 2; j++){
P_GREEN_LED = 1; // 緑色LEDを点灯
//一定時間待つ
for(i = 0; i < LED_ON_CYCLE_TIME; i++){
wait_1ms(); //1ms待つ(シミュレータでは0.5~1.5ms待つ)
}
P_GREEN_LED = 0; // 緑色LEDを消灯
}
//青色LEDを1回点滅
for(j = 0; j < 1; j++){
P_BLUE_LED = 1; // 青色LEDを点灯
//一定時間待つ
for(i = 0; i < LED_ON_CYCLE_TIME; i++){
wait_1ms(); //1ms待つ
}
P_BLUE_LED = 0; // 青色LEDを消灯
//一定時間待つ
for(i = 0; i < LED_ON_CYCLE_TIME; i++){
wait_1ms(); //1ms待つ
}
}
}
}
このプログラムを使って、本当は緑LED2回点滅⇒青LED1回点滅・・・と繰り返したかったけれど、プログラムを実行してみたら緑LEDが3回も点滅した、という場面を想定してみましょう。
↓理想の実行結果
↓実際の実行結果
この時、for文でLEDの点滅回数を決めているのに、その点滅回数が間違っているなら疑うべきなのはfor文での繰り返し回数ですよね?
なのでfor文中の変数jが正しく判定されているか確認を行うことにします。
じゃあ順番に確認していきましょう。
1、まず、確認したい場所にブレークポイントをはる
変数jの値を確認したいので、最初に上で説明した方法と同じようにfor文の中にブレークポイントを設定しましょう。
2、プログラムを実行して、ブレークポイントの箇所で停止させる
次にプログラムの実行ボタンを押して、ブレークポイントを設定した箇所でプログラムを停止させます。
そうすると、この時点では変数jに0が入っていることが分かりますね。
2回繰り返しを実行したいなら、この変数jは0~1までしか入らないはずです。それをこれから確認します。
3、実行ボタンで2回分プログラムを実行させてみる
実際に実行ボタンを使って2回分プログラムを実行してみると、ウォッチウィンドウはこうなります。
この時の変数jの値を見てみると、「2」!
変数jが2まで増えてるじゃん!!
っていうことが分かるんですね。
だから、この変数jが2まで増えている原因を探っていけばいいわけです。
このfor文の中で変数jが2までいっている時に疑うなら、変数jの繰り返し条件を判定している式ですよね?
この式で変数jに2が入った時のことを想定してみると「for(j = 0; 2 <= 2; j++)」となって、「条件満たしてないじゃん!」ってことに気付くわけです。
そして条件を満たす為には、<から=を外せばいいから「for(j = 0; j < 2; j++)」が正しいプログラムだ!と修正することができます。
OKですか?
このような流れでデバッグ機能を使うとプログラムの細かい動きが確認できて、デバッグが格段に捗ります。
このデバッグ方法はホント頻繁に使いますから体に叩き込みましょう。
繰り返しデバッグをして慣れていくことで、プログラムを修正するまでのスピードがグイグイ早くなってきますよ♪
これがデバッグの3大機能です。
プログラム作成してからのデバッグ作業が一番つまづきやすい所なのに、意外とほとんどのプログラミング学習サイトでこのデバッグ方法を載せていないですよね。
本当に説明しない意味が分からない。プログラマーには絶対に必要な内容でしょ。
でもこのデバッグ方法を身に付けるのはホントにマジで大事なので、何度も繰り返してください。
また分からないことがあったらコメントか直接質問くださいね。待ってます!
気軽にコメントどうぞ!