DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

VB6のDebug.Printと同じ事を行うには?

VB6のDebug.Printメソッドは、指定した文字列をイミディエイトウィンドウに出力するメソッドで、デバッグで変数の中身を確認したいときなどに利用されます。.NET FrameworkでVB6のDebug.Printメソッドと同様の機能は、System.Diagnostics名前空間にあるDebugクラスWriteLineメソッドということになりそうです。.NET Framework 2.0からはそのものズバリのDebug.Printメソッドも使えるようになりましたが、これはDebug.WriteLineメソッドと同じです。

Debug.WriteLineメソッドは、指定した文字列を一行で(文字列の末尾に改行文字列を付けて)、通常Visual Studioの「出力ウィンドウ」に出力します。出力ウィンドウは、Visual Studioのメニュ「表示」-「出力」(キーでは、Ctrl+Alt+O)で表示できます。

補足:出力先は変更することができます。その方法は、「TraceやDebugのWriteメソッドでファイルに出力する」で説明しています。

DebugクラスにはWriteLineの他にも似たメソッドとして、Write(改行しないで出力)、WriteIf(条件により出力)、WriteLineIf(条件により一行を出力)などもあります。

以下にDebugクラスを使った例を幾つか示します。

VB.NET
コードを隠すコードを選択
'出力ウインドウにメッセージを一行表示する
System.Diagnostics.Debug.WriteLine("スタート!")
'インデントする
System.Diagnostics.Debug.Indent()
'GetCommandLineArgs().Lengthが1より大きい時にメッセージを一行表示する
System.Diagnostics.Debug.WriteLineIf( _
    Environment.GetCommandLineArgs().Length > 1, "コマンドラインあり")
'アンインデントする
System.Diagnostics.Debug.Unindent()
C#
コードを隠すコードを選択
//出力ウインドウにメッセージを一行表示する
System.Diagnostics.Debug.WriteLine("スタート!");
//インデントする
System.Diagnostics.Debug.Indent();
//GetCommandLineArgs().Lengthが1より大きい時にメッセージを一行表示する
System.Diagnostics.Debug.WriteLineIf(
    Environment.GetCommandLineArgs().Length > 1, "コマンドラインあり");
//アンインデントする
System.Diagnostics.Debug.Unindent();

上記のコードを実行すると、例えば、次のように出力されます。

スタート!
    コマンドラインあり

DebugクラスとTraceクラスの違い

Debugクラスと似たクラスにTraceクラスがあります。DebugクラスはDEBUGシンボルが定義されている時だけ有効ですが、TraceクラスはTRACEシンボルが定義されている時だけ有効です。通常デバッグビルド(ソリューション構成が「Debug」)ではDEBUGとTRACEの両方が定義されますが、リリースビルド(ソリューション構成が「Release」)ではTRACEのみ定義されます。よって通常は、Debugクラスはデバッグビルドでのみ有効で、Traceクラスはデバッグビルドとリリースビルドの両方で有効です。

シンボルを定義する方法については「デバッグビルドでのみ特定のコードがコンパイルされるようにする」で詳しく説明していますので、そちらをご覧ください。

補足:DebugクラスとTraceクラスのすべてのメソッド(Trace.Refreshメソッドは除く)には、Conditional属性が適用されています。Conditional属性については、「デバッグビルドでのみ特定のコードがコンパイルされるようにする」をご覧ください。

出力ウィンドウに出力されない時は

Debug.Writeメソッドを呼び出したのに出力ウィンドウに何も表示されない場合は、以下の点をご確認ください。

イミディエイトウィンドウに表示されていないか確認する

Visual Studioの設定によっては、出力がイミディエイトウィンドウに表示されている場合があります。イミディエイトウィンドウは、メニューの「デバッグ」-「ウィンドウ」-「イミディエイトウィンドウ」で表示できます。

イミディエイトウィンドウではなく出力ウィンドウに表示させるには、Visual Studioのメニューで「ツール」-「オプション」を選択してオプションダイアログを開き、「デバッグ」-「全般」カテゴリにある「出力ウィンドウの文字をすべてイミディエイトウィンドウにリダイレクトする」を無効にします。

DEBUGシンボルが定義されているか調べる

Visual Studioのツールバーにあるソリューション構成(「開始」ボタンの右)が「Debug」になっていることを確認してください。「Release」ではダメです。

ソリューション構成でDebugを選択

また、以下のようなコードでDEBUGシンボルが定義されているか調べることができます。

VB.NET
コードを隠すコードを選択
#If DEBUG Then
    Console.WriteLine("DEBUGが定義されています")
#End If
C#
コードを隠すコードを選択
#if DEBUG
    Console.WriteLine("DEBUGが定義されています");
#endif

DEBUGシンボルを定義する方法は、「デバッグビルドでのみ特定のコードがコンパイルされるようにする」をご覧ください。

出力ウィンドウの設定で「プログラム出力」が有効になっているか確認する

出力ウィンドウを右クリックするとコンテキストメニューが表示されます。ここで、「出力ウィンドウ」という項目にチェックが入っていることを確認してください。チェックがなければ、クリックして有効にしてください。

Trace.Listenersに適当なトレースリスナを追加する

通常はTrace.Listenersプロパティ(または、Debug.Listenersプロパティ)が返すトレースリスナのコレクションにはDefaultTraceListenerが存在しており、これによって出力ウィンドウに出力されます。何らかの理由でトレースリスナのコレクションからDefaultTraceListener(または、標準出力に出力するトレースリスナ)が削除されていると、出力ウィンドウに何も出力されなくなります。

補足:DefaultTraceListenerはOutputDebugString関数を使ってデバッガにメッセージを送信します。このメッセージは通常、Visual Studioの出力ウィンドウに表示されます。また、このメッセージはDebugViewのようなツールを使っても表示することができます。

トレースリスナについてはここでは詳しく説明しませんので、「TraceやDebugのWriteメソッドでファイルに出力する」をご覧ください。

以下に、トレースリスナのコレクションにDefaultTraceListenerを追加する例を示します。なお、DefaultTraceListenerがすでに追加されているのにまた追加した(重複して追加した)場合は、メッセージが2回出力されるようになります。

VB.NET
コードを隠すコードを選択
'Imports System.Diagnostics

'Trace.Listenersに新しいDefaultTraceListenerを追加する
Trace.Listeners.Add(New DefaultTraceListener())

'次のようにConsoleTraceListenerを追加すると、標準出力に出力される
'Trace.Listeners.Add(New ConsoleTraceListener())
C#
コードを隠すコードを選択
//using System.Diagnostics;

//Trace.Listenersに新しいDefaultTraceListenerを追加する
Trace.Listeners.Add(new DefaultTraceListener());

//次のようにConsoleTraceListenerを追加すると、標準出力に出力される
//Trace.Listeners.Add(new ConsoleTraceListener());

その他

debugging - VB.NET Debug.Print not working, breakpoint disappears」には、プラットフォームターゲットを「x86」から「AnyCPU」にしたら直ったという報告があります。

  • 履歴:
  • 2013/12/16 Debug.Printメソッドの説明を追加、「出力ウィンドウに出力されない時は」を追加など。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • コードの先頭に記述されている「Imports ??? がソースファイルの一番上に書かれているものとする」(C#では、「using ???; がソースファイルの一番上に書かれているものとする」)の意味が分からないという方は、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。