連載

プロフェッショナルVB.NETプログラミング
―― VB 6プログラマーのためのVB.NET入門 ――

第13回 デバッグとトレース

(株)ピーデー
川俣 晶
2002/07/13

Page1 Page2

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番目の説明文字列には、より詳細な説明を含めることができる。


 INDEX
  連載 プロフェッショナルVB.NETプログラミング
  第13回 デバッグとトレース
  1.Debug.AssertとTrace.Assert
    2.TraceとDebugの違いを確認する
 
「プロフェッショナルVB.NETプログラミング」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間