DebugとTraceクラスには、共通するメソッドが多くあります。
Debugクラスのメソッドはリリース ビルドでは無視されますが、Traceの方はリリースでも評価されます。ただしこれは既定の動作であり、"DEBUG"、"TRACE"シンボルの定義によって変わります。解説 - Debug クラス (System.Diagnostics) | MSDN
Debug | Trace |
---|---|
Assert() | |
Close() | |
× | Equals() |
Fail() | |
Flush() | |
× | GetHashCode() |
× | GetType() |
Indent() | |
Print() | × |
× | Refresh() |
× | ToString() |
× | TraceError() |
× | TraceInformation() |
× | TraceWarning() |
Unindent() | |
Write() | |
WriteIf() | |
WriteLine() | |
WriteLineIf() |
[ConditionalAttribute("DEBUG")] public static void Assert( bool condition )Debug.Assert メソッド (System.Diagnostics) | MSDN
conditionがfalseのとき、メッセージボックスで呼び出し履歴 (Call stack) を表示します。
DebugクラスのAssert()はTraceのそれとは異なり、既定ではリリース時には評価されません。そのためconditionにboolを返すメソッドを記述すると、リリース時には呼び出されなくなります。
[ConditionalAttribute("DEBUG")] public static void Fail( string message )Debug.Fail メソッド (String) (System.Diagnostics) | MSDN
無条件にエラーメッセージを表示します。予期しないブロックに処理が到達したときに、それを通知できます。
Debug.Listenersプロパティへ書き込みます。
[ConditionalAttribute("DEBUG")] public static void Write( string message )Debug.Write メソッド (String) (System.Diagnostics) | MSDN
System.Diagnostics.Debug.Write("ABC");
Visual Studioでは、既定で出力ウィンドウへ出力されます。
メソッド | 出力内容 |
---|---|
Write(object value) | value.ToString() |
Write(object value, string category) | category : value.ToString() |
Write(string message) | message |
Write(string message, string category) | category : message |
メソッド |
---|
WriteLine(object value) |
WriteLine(object value, string category) |
WriteLine(string message) |
WriteLine(string message, string category) |
WriteLine(string format, params object[] args) |
Debug.Write("{0}" , 1); // "1" Debug.Write("{0}" , "A"); // "A: {0}" 文字列を1つ渡すと、categoryと見なされる Debug.Write("{0}{1}" , "A", "B"); // "AB" Debug.Write("{0}{1}{2}", "A", "B", "C"); // "ABC"
[ConditionalAttribute("TRACE")] public static void Assert( bool condition )Trace.Assert メソッド (Boolean) (System.Diagnostics) | MSDN
Debug.Assert()との相違はConditionalAttributeのコンパイル シンボルだけであり、機能は同一です。 Assert - Trace.cs Assert - Debug.cs
デバッガの情報を得られます。
プログラム側から、デバッガがアタッチされているか確認できます。Debugger.IsAttached Property (System.Diagnostics) | Microsoft Learn
if (System.Diagnostics.Debugger.IsAttached) { // [デバッグの開始 (Start Debugging)]で実行されている } else { // [デバッグなしで開始 (Start Without Debugging)]で実行されている }
既定では、C#からC++のコードをデバッガで追えません。C++のコードへ入ろうとすると、「デバッグ対象の言語 C++ は、現在のデバッガー設定と互換性がありません。この構成を変更するには、[ツール] メニューの [オプション] をクリックし、[デバッグ] をクリックして、[全般] の [マネージ互換モードの使用] チェック ボックスをオンにしてから、デバッグ セッションを再開してください。」として拒否されます。
この[マネージ互換モードの使用]をチェックするとC++をデバッグできるようになりますが、エディット コンティニュが無効となります。
C++を含むコードのデバッグ時にC++から例外が投げられると、「vshost32.exe は動作を停止しました」として強制終了させられることがあります。その場合にはVisual Studioのオプションの[デバッグ]で、[ネイティブ互換モードの使用]をチェックします。