|
|
連載
プロフェッショナルVB.NETプログラミング
―― VB 6プログラマーのためのVB.NET入門 ――
第13回 デバッグとトレース
(株)ピーデー
川俣 晶
2002/07/13
|
Debug.AssertとTrace.Assert
VB 6(Visual Basic 6.0)のDebugオブジェクトは、この連載でもずっと使ってきた。しかし、利用したのはPrintメソッドだけに限られていた。だが、Debugオブジェクトにはもう1つ、Assertというメソッドが存在する。では、このAssertを用いたVB 6のソースは、VB.NET(Visual Basic .NET)ではどうすればよいのだろうか?
まず、Debug.Assertを使用したソースを記述してみた。
1: Private Sub Form_Load()
2: Dim i As Integer, j As Integer
3: For i = -10 To 10
4: Debug.Assert i <> 0
5: j = j + 100 / i
6: Next
7: Debug.Print j
8: End Sub
|
|
Debug.Assertを使用したVB 6のサンプル・プログラム1 |
これを実行すると以下のようになる。
|
サンプル・プログラム1の実行結果 |
このように、Debug.Assertを実行する際、指定された式が成立していないと、そこで開発環境にブレークを掛けてくれる。この機能は、デバッグ中のブレーク・ポイントとして使うというよりも、誤った値のままプログラムが進行することを未然に防ぎ、バグを素早く察知するためにソースの各所に埋め込むものである。例えば、メソッドを自分で記述する際、指定してよい値に限定された範囲があるとき、その範囲のチェックをDebug.Assertを用いてメソッドの先頭に入れておくことができる。こうしておけば、メソッドを作成したプログラマーが意図しない値が引数に指定されて実行されると、Debug.Assertメソッドが察知してくれるというわけである。
では、このソースをVB.NET用に書き換えるには、どうしたらよいだろうか?
1: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
2: Dim i, j As Integer
3: For i = -10 To 10
4: Trace.Assert(i <> 0)
5: j = j + 100 / i
6: Next
7: Trace.WriteLine(j)
8: End Sub
|
|
Trace.Assertメソッドを用いてサンプル・プログラム1を書き換えたVB.NETのサンプル・プログラム2 |
結論からいえば、Debug.Assertメソッドの代わりに、Trace.Assertメソッドを使えば意図する結果が得られる。基本的に難しい話ではない。しかし、コードの書き換えは簡単でも、それが及ぼす効果が違う。
これを実行すると以下のようになる。
|
サンプル・プログラム2の実行結果 |
つまり、発生位置のソースファイル名や行番号を含む呼び出し履歴相当の情報がダイアログ・ボックスに表示され、実行を中止するか、デバッガに入るか、無視して継続するかを選択できるようになった。
これだけなら、VB 6でも、ブレーク状態に入れば、ほかのウィンドウで閲覧できる情報ばかりである。ありがたみがないかのように思えるかもしれないが、実はそうではない。VB 6のDebug.Assertと、VB.NETのTrace.Assertでは、決定的な相違が存在するのである。それは、EXEファイルを作成後にそれを実行した場合、VB 6のDebug.Assertは何も存在しなかったかのように扱われるのに対して、VB.NETのTrace.Assertでは機能を維持しているということである。VB 6では、開発環境内で実行した場合のみDebug.Assertによる中断が発生するが、VB.NETでは開発環境内でも外でも中断が発生する。開発環境外で実行したときにもダイアログ・ボックスにさまざまな情報が表示されるのは、デバッグ情報を得るという意味で有益な機能といえる。
だが、常時その機能が有効ということになると、困る場合もあるだろう。もし、デバッグ中だけ有効であってほしい、つまり出荷版では無効になってほしいと思うなら、以下のように記述することができる。
1: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
2: Dim i, j As Integer
3: For i = -10 To 10
4: Debug.Assert(i <> 0)
5: j = j + 100 / i
6: Next
7: Trace.WriteLine(j)
8: End Sub
|
|
Trace.AssertをDebug.Assertに書き換えたVB.NETのサンプル・プログラム3 |
このソース・コードは、Debugビルドの場合と、Releaseビルドの場合で、異なる結果になる。Debugビルドの場合は以下のようになる。
|
サンプル・プログラム3の実行結果(Debugビルドの場合) |
Releaseビルドの場合は以下のようになる。
|
サンプル・プログラム3の実行結果(Releaseビルドの場合) |
ソース・コードを見ると、変更点は、Trace.AssertをDebug.Assertに書き換えただけである。Debug.Assertは、VB 6のものとくしくも同名ということになるが、機能は同じではない。VB.NETの(より正確にはクラス・ライブラリの)TraceクラスとDebugクラスはほぼ同じ機能を持っている。しかし、機能が有効になる条件が異なっている。DebugクラスはDebugビルドの場合のみ機能を発揮するが、Traceクラスはビルドの種類に関係なく機能を発揮する。これは、WriteLineなどのほかのメソッドでも同じことがいえる。DebugクラスのWriteLineメソッドは、TraceクラスのWriteLineメソッドと同様の働きを行うが、あくまでDebugビルドの場合のみである。
さて、もう1点、VB 6のDebug.AssertメソッドとVB.NETのTrace.Assert(およびDebug.Assert)が等価ではない点がある。それは、説明のための文字列を付加できるかどうかという点である。以下は、VB.NETのTrace.Assertに説明のための文字列を追加した例である。
1: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
2: Dim i, j As Integer
3: For i = -10 To 10
4: Trace.Assert(i <> 0, "i <> 0", "除算のため変数iはゼロでなければなりません")
5: j = j + 100 / i
6: Next
7: Trace.WriteLine(j)
8: End Sub
|
|
Trace.Assertに説明のための文字列を追加したVB.NETのサンプル・プログラム4 |
これを実行すると以下のようになる。
|
サンプル・プログラム4の実行結果 |
Assertメソッドは引数1つ、2つ、3つのバリエーションがある。引数1つの場合は、単純に、判定させたい式を記述することしかできない。2つの場合は簡単な説明文字列を付加することができる。3つの場合は、説明の文字列を2つ付加することができ、2番目の説明文字列には、より詳細な説明を含めることができる。
Insider.NET 記事ランキング
本日
月間