Win32プログラミング講座 〜 Step20. プロセス デバッガによるデバッグに挑戦 〜


・プログラミングはしてみたけど、いざ実行すると強制終了してしまう。なんでぇ〜(>_<)
・この変数の値がちゃんとしてるか、MessageBoxでいちいちチェックするのって面倒…

そこのあなた、こんなお悩み抱えていませんか?こんなときに登場するのが「プロセス デバッガ」。デバッグのやり方さえ覚えてしまえば、これらの問題はスマートに解決できます。

そもそも、デバッグって何?

「デバッグ」=「バグを取り除く」などという意味を持ちますが、一般的に、作ったプログラムに不具合はないかを、コードを一つ一つチェックしながら実行したり、任意のタイミングで変数の内容を表示しながら実行するといったことをしてチェックします。

論より証拠、実際にデバッギングを体験してみましょう。
まずは誰が見てもおかしいことに気付くプログラムをリリース コンパイル(F7キー)し、実行してみます。

Dim i As Long
Dim a[10] As Long

For i=0 To 10
	a[i]=i
Next

i=0
Do
	a[i]=i
	i=i+1
Loop

無限ループで配列要素が大きくなりすぎるという誰でも予想がつくバグを潜ませておきましたが、予想通り出ましたね、「アプリケーション エラー」。Win9x系のOSでは、「不正な処理」がでているのではないでしょうか?
ここでは余裕な顔をしていられますが、これが自分の力作プログラムで起こったのであれば、面白いはずがありません。

では、どう対処するのか

それは、これらのボタンが解決してくれます。左から、「デバッグ実行」、「デバッグ コンパイル」というコマンドとなり、メニューの「ベーシック」からも利用することができます。
大概の場合はデバッグ実行(ビックリマークのほう)で事足りてしまうので、初めての方はデバッグ コンパイルのほうはあまり考えなくてよいです。

では、先ほどのおかしなプログラムを開いた状態で、デバッグ実行をしてみましょう。

すると、アクセスエラーを起こした行の位置でプログラムがストップし、プロセスデバッガが情報を伝えてくれます。ご丁寧に、@のようにエラーの行が反転表示され、Aのメッセージが表示されると共に、Bのダイアログボックスが表示されます。

このBの「ブレーク ポイント」ダイアログボックスが以下のようなプログラムの実行状況を伝えてくれます。

・グローバル変数
・ローカル変数(プロシージャ実行時に限る)
・スレッド
・プロシージャの階層状況

今回はおかしなプログラムのデバッグということで進めているので、ここに表示されている変数iの値に注目してみます。
iは310になっていますね(環境によって多少異なります)。とすると、a[310]という配列変数に値310が代入されることになるわけですが、配列aで扱える変数データは10コまでとなっているはずです。当然、310ではアクセスエラーとなります。(309ではいいのか?という問題については、メモリの配置図ウンヌンという話になってしまうので、あまり深く考えずに・・・)

という風に、無事、プログラムのアクセス エラーの場所が判明されました。デバッギングはここまで。エラーにならないよう、後に修復を行うのはあなたのお仕事です☆



プログラムを意図的に停止させる、Debug命令語

デバッグコンパイル時のみ有効であり、リリースコンパイル時には無視されるDebug命令語、プログラムをトレース実行するにはもってこいの命令です。ここでも非常に簡単なプログラムでDebug命令語を体験してみましょう。

Dim a As Long

Debug
a=10
a=20
a=30

なんじゃこりゃ!?と思えてしまうようなプログラムですが、主役はDebug命令語です。デバッグ実行をしてみると、すぐさま、「ブレーク ポイント」ダイアログが表示されるはずです。

そしたら、今度は、「ステップ(OVER)」をクリックしてみて下さい。するとすぐに同じダイアログボックスが表示されるわけですが、変数aの値が10に変化しているのにお気づきでしょうか?それと共に、プログラムの実行位置も "a=10" の行になっていますね。

もうなにをしたかはお気づきですね。そうです、一行ずつ実行をしているのです。更に「ステップ(OVER)」をクリックしていくと、aの内容は20、30と変化し、プログラムは無事終了します。

このように、デバッガを利用することで、プログラムを一行ずつ実行して動きをチェックしていくことができます。Debug命令語はプログラム内の様々な場所に何個でも配置することができます。

ところで、ステップ(IN)とステップ(OVER)の違いは?

そうそう、忘れないうちに説明しておきましょう。非常に似たような機能ですが、以下のような相違点があります。

・ステップ(IN) … 内部プロシージャ呼び出しの行を実行する場合に、プロシージャ内に入る
・ステップ(OVER) … 内部プロシージャ呼び出しの行を実行する場合に、プロシージャを実行して飛び越す

一言で言えば、プロシージャ内に入って調べるか、飛び越すかの違いです。プロシージャ呼び出しではない行の場合はどちらも同じです。



最後に

デバッグの達人はプログラミングの達人です。積極的にデバッガを利用し、どんなバグに対しても対処できるようになりしたものですね。私ももう少しがんばらねば…

前へ戻る - 次へ進む
トップへ戻る


©2005 Discoversoft