さて、今回はプログラムの解説ではなくBeIDEの使い方、第2弾です。
プログラムを打ち込んで実行したときにうまく行かないことが多々あります。
その時のチェックに役立つのが、BeIDEに付属しているデバッガーです。
1行ずつ実行し、その時の変数の値を逐次見ることが出来ます。
このデバッガー、最初は全部英語でとっつきにくい面もあるのですが、一度覚えてしまえばこれほど強力なツールもありません。
あと、この文章はIntel版を元にしているのでMacの方はごめんなさい。
さて、デバッガーを使うためには、現在のプロジェクトの設定を少々いじる必要があります。
まず、プロジェクトの画面のメニューの[Edit] - [Project Settings]から、
x86 Code Generatorを選ぶと以下のような画面になります。
ここに[Generate debugging information]という項目があるので、ここにチェックを入れます。
なお、ここにチェックを入れるとその下の最適化オプション(Optimizations)のレベルが、
自動的になし(None)になってしまいますので、今後デバッグ情報をオフにしたときに、
設定し直す必要がありますので気をつけてください。
あと、デバッグ情報に限ったことではないですが、プロジェクトの設定(Project Settings)をいじったときは
ソース全部をメイクし直す必要があります。
次に、[Project] - [Enable Debugger]をクリックしてください。
そうすると、同じメニューが次のように変化したと思います。
[Enable Debugger] が [Disable Debugger] に、[Run] が [Debug] に変化したと思います。
実は、[Generate debugging information]にチェックを入れなくとも、[Enable Debugger]をクリックすれば
勝手に、[Generate debugging information]にチェックが入るのですが、
[Disable Debugger] を押しても、チェックが外れるわけではないので注意してください。
ここら辺の話は、文章で読むより実際やってみたほうが分かりやすいと思います。
さて、前回のソースを例に、実際にデバッグ作業をやってみましょう。
まず、[Debug]をクリック(または Alt か Ctrl と R を同時に押す)すると以下のような画面になります。
最初は、日本語が化けてしまいますが、[Window] - [Settings]の所に[Font:]という項目があるので、
そこを日本語を含むフォントに変更してください。
基本的には[Haru]にしておけば問題ないと思います。
一番最初は、プログラムがまだ開始されていない状態です。
青い矢印が今実行されている部分を指しています。
ここから、プログラムを少しずつ実行するわけですが、そのためのコマンドには次の5種類があります。
| コマンド名 | ショットカットキー | 説明 |
| Run | Alt(Ctrl) + R | 普通に実行 |
| Step | Alt(Ctrl) + S | 一行実行(関数だったらその中に入る) |
| Step Over | Alt(Ctrl) + T | 関数を飛び越して1行実行 |
| Step Out | Alt(Ctrl) + U | 現在実行している関数の終わりまで実行 |
| Kill | Alt(Ctrl) + K | デバッグの終了 |
さて、一行ずつ実行する方法はわかりますが、特定の場所を調べるには、かなり不便です。
そのために、ウォッチポイントというものを指定できます。
ソースが表示されている左側に、小さく横線が引かれていると思いますが、
そこの左側をクリックすると、赤い×が表示されます。
今回は、チェックボックスを押したときに、メッセージがちゃんと期待通りに呼ばれているか、
MyVIew::MessageReceived()関数内にウォッチポイントを設定して、実行過程を見てみたいと思います。
まず、次の行にウォッチポイントを設定してみてください。
これで、MyView::MessageReceived()関数が呼ばれると、即座にデバッガの画面に戻るようになります。
さて、上の様にウォッチポイントを設定したら、Runで普通に実行してください。
そうしたら、チェックボックスとボタンを持ったウィンドウ(前回作ったもの)が出てきたと思うので
とりあえず、チェックボックスをクリックしてください。
そうしたら、青い矢印がウォッチポイントの所へ来て、デバッガのウィンドウが前面に出てきたと思います。
次の図は、MessageRecevied()関数が呼ばれてから少し進めた図です。
ここで、右上の変数の表に注目してください。checkboxのアドレスをBMessage::FindPointer()で更新しているのですが、
その値が赤になって、更新されているのがわかります。
BMessage::FindPointerで、チェックボックスのアドレスを取得していると第7回に書きましたが、
それは、MyView.m_checkboxの値と同じになるはずであると説明しました。
デバッガで本当にそうなっているかどうか、検証してみようと思います。
ここの変数表でthisとは、現在実行されているオブジェクト(この場合はMyView)を示しているのですが、
その左側に、右向きの矢印がありますので、それをクリックしてください。
そうすると、thisに含まれるメンバ変数の値がすべて表示されます。
上の図を見てもわかる通り、m_checkboxとローカル変数checkboxのアドレス値は
0x8000ba28となっており、同じであることがわかります。
アドレス値は環境によってもちろん変わりますので、これを読んでいる方が実行されたときは
別の結果になっている可能性がありますが、m_checkboxとcheckboxは
同じ値が表示されているはずです。
今回はファイルがひとつだけだったのですが、ファイルが複数あるプロジェクトの場合、
main関数とは別の所にウォッチポイントを設定したいことがほとんどです。
ファイル選択の画面は、今まで説明してきたウィンドウとは別に、Teamウィンドウというものがあります。
上の図は、私が現在作っているプログラムのものですが、ここのFilesという所で、
ファイルを選び、特定のソースファイルにウォッチポイントを設定することが出来ます。
最後に、変数表示機能で便利な機能をもう一つ紹介します。
いままで、調べてきたのはアドレス値だけでしたが、文字列や変数の値そのものを調べたい場合は、
変数の値をクリックしたあとに、[Data]をクリックしてください。
ここで、表示する値の形式が選べます。
次の表に、その意味の一覧を示します。
| Dataのメニュー | 説明 |
| View Memory | そこのアドレスをバイナリ形式で別ウィンドウに表示 |
| Default | 標準形式 |
| Signed Decimal | 符号付き10進数形式 |
| Unsigned | 符号なし10進数形式 |
| HexDecimal | 16進数形式 |
| Character | 文字形式 |
| C String | 文字列形式 |
| Enumaration | enum型形式 |
| View As | 別の型と見なして表示 |
| View As Array | 配列形式 |
このようにいろいろな形式が選べるので、試してみてください。
今回のデバッガの使い方はいかがでしたでしょうか?
デバッガの使い方がわかると、プログラムのデバッグのしやすさが格段に違うので是非試してみてください。