プログラムの流れを見る
コンテンツ
プログラムのデバッグ
プログラムの中から
間違え(バグ)を探し,修正する作業のことを
デバッグといいます.プログラムを作成していく中で,プログラムの記述に関する間違え・誤植などを修正していくことはプログラマーにとって避けることができない作業です.ただ,どこにどのようなバグが潜んでいるのかは,ソースコードを眺めるだけでは,検出するのが非常に困難な作業となります.
そのため,プログラムを開発するための統合開発環境(本授業でいうVisual Studio)には,論理的なエラーを見つけるためのデバッガという「デバッグを支援するためのプログラム」が含まれています.例えば,プログラムを実行させたときに,エラーが検出され,実行が強制的に止められることがありますが,これはデバッガが論理的なエラーを検出したために生じます.また,このような全体的なエラー検出だけではなく,開発者がソースコードを1行ずつ確認することを支援するステップ実行などもあります.
たとえプログラムの記述として間違っていなくても,理想とする出力が得られない場合,プログラムの中に潜在的なバグが含まれている可能性が高くなります.たとえば,以下のようなプログラムを書いてみましょう.
Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim a As Integer
Dim b As Integer
Dim c As Integer
a = 11 / 3 '商(整数)
b = 11 Mod 3 '商の余り
c = a * 3 + b '(商 × 割った数) + 余り ⇒ 11 になるかな?
Label1.Text = c
End Sub
End Class
ここでの演算処理は,11割る3の商の整数値,余りを求め,逆算的に11を算出するというプログラムです.このプログラムそのものは,なんのエラーもなく,実行することができるのですが,出力してみると,結果が 14 と表示されてしまいます.理由に関して結論を述べると,ここでは整数除算を使用していないため,除算において値が四捨五入され,本来得るべき 3 という解が得られないことが原因となっています.
このような小規模な開発では,バグの検出もそんなに難しくないのですが,ソースコードは数千,数万行になることも珍しくないので,効果的にこのようなバグを確認する機能が必要となります.そのためのツールとして,ブレークポイントという機能が有効的に活用できます.ブレークポイントを使用すると,プログラムの実行中に処理を一時的に止めて,扱われている変数の中身などが確認できます.
では,早速ブレークポイントを使ってみましょう.
まず,以下の図のように,ソースコードのエディタの左側において,処理を止めたい箇所にマウスで「左クリック」を行ってください.すると,赤い点が表示されます.
次に,この状態のまま,プログラムを実行してください.通常通り,プログラムが実行されると思いますが,フォーム上のボタンをクリックすると,プログラムが止まり,ソースコードのエディタが画面上に出てきます.このとき,プログラムは中断モードになり,中断されている箇所が黄色くハイライトされて表示されます.
中断モードになると,マウスのカーソルを変数の上まで持っていくことで,変数の中身を確認することが出来ます.試しに,変数 a にカーソルを当ててみましょう.以下のように変数の中身が見れたでしょうか?
a の中身ですが,4 と表示されていますね.つまり,3 と計算されてほしいのに,この部分で計算が間違っているということが確認できたことになります.
ステップ実行
以上のように,ブレークポイントは,バグの箇所がある程度分かっているのであれば,有効的に活用できます.しかし,それがわからない場合には,一行ずつ処理を見ていくことも一つの手として考えられます.そのような手段として使用できるのがステップ実行です.ステップ実行は,任意の場所からすべての行にブレークポイントを置くことができるような作業だと思ってください.
例えば,上述のプログラムの演算部分を一行ずつ確認したい場合,以下のように演算の始まりの行にブレークポイントを置きます.
このときにプログラムを実行し,フォーム上のボタンを押すと,先程と同じようにプログラムが中断モードに移ります.
次に,画面上のメニューバーから「デバッグ」を選択し,その中の「ステップイン」という項目を選択してみてください.これが,ステップ実行を意味しています.
さて,選択するとブレークポイントの一行下で,処理が中断したでしょうか? このように各ステートメントごとの処理を確認していくことが可能となります.