連載
プロフェッショナルVB.NETプログラミング
第13回 デバッグとトレース
(株)ピーデー
川俣 晶
2002/07/13
|
|
TraceとDebugの違いを確認する
TraceとDebugの違いがいまひとつピンとこない人のために、具体的な違いを実感する簡単なプログラムを記述してみた。
1: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
2: Trace.WriteLine("Trace.WriteLine")
3: Debug.WriteLine("Debug.WriteLine")
4: End Sub
|
|
TraceとDebugの違いを比較するためのVB.NETのサンプル・プログラム5 |
このソースをDebugビルドして実行すると以下のようになる。
1: Trace.WriteLine
2: Debug.WriteLine
|
|
サンプル・プログラム5の実行結果(Debugビルドの場合) |
このソースをReleaseビルドして実行すると以下のようになる。
|
サンプル・プログラム5の実行結果(Releaseビルドの場合) |
見てのとおり、Trace.WriteLineは常時機能するが、Debug.WriteLineが機能するのはDebugビルドのときだけである。
Debugビルドは、デバッガでソース・コード・デバッグができるが、最適化機能が働かないため、動作が遅く、プログラムも大きくなる傾向にある。それに対して、Releaseビルドは最適化機能が働き、小さく素早いコードが生成されるが、デバッグ情報がないため、ソース・コードを追いかけながらデバッグすることはできない。両者をうまく切り替えながら使っていこう。
条件式抜きで必ず停止させるFail
Assertメソッドを使っていると、ときどき条件式が必要ない場合に遭遇する。つまり、ソース・コード上のある位置を実行してしまったというだけで、すでに間違っていることが明白な場合である。以下は、そういう状況を表現してみたプログラムである。
1: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
2: Dim i, sum As Integer
3: For i = 0 To 99
4: 'sum = sum + i
5: If sum > 100 Then
6: Trace.WriteLine(sum)
7: Exit Sub
8: End If
9: Next
10: Trace.Fail("内部エラー: ループが意図しない理由で終了しました")
11: End Sub
|
|
条件式が不要なTrace.Failメソッドを使用したVB.NETのサンプル・プログラム6 |
このソース・コードは本来、足し算を続け、3行目のForループが完結する前に終了することを意図している。しかし、4行目に書かれるべき足し算のコードを書き忘れているため、Forループから中途脱出せず、ループを終了してしまう。つまり10行目が実行されることは、このプログラムの意図として必ず間違いということになる。そのような場合は、Assertメソッドではなく、10行目のようにFailメソッドを使うとよい。Failメソッドは条件に関係なく、常にプログラムの実行をそこで一時停止させる効能を持つ。
これを実行すると以下のようになる。
|
サンプル・プログラム6の実行結果 |
見てのとおり、結果はAssertと同じだが、条件式を書く必要はなくなっている。
次回予告
次回はエラー処理と例外処理を取り上げたいと考えている。
Insider.NET 記事ランキング
本日
月間