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() |
型 | プロパティ | 内容 |
---|---|---|
TraceListenerCollection | Listeners | デバッグ出力を監視するリスナーのコレクション |
Debug.Listeners.Clear()
としてリスナーの登録を解除すると、評価に失敗してもメッセージ ボックスは表示されなくなります。Assert(Boolean) - Debug.Assert Method (System.Diagnostics) | Microsoft Learn
[ConditionalAttribute("DEBUG")] public static void Assert( bool condition )Debug.Assert メソッド (System.Diagnostics) | MSDN
conditionがfalseのとき、メッセージ ボックスで呼び出し履歴 (Call stack) が表示されます。この既定の動作は、Listenersに別のTraceListenerを用意することで変更できます。c# - How to prevent Debug.Assert(...) to show a modal dialog - Stack Overflow
DebugクラスのAssert()はTraceのそれとは異なり、既定ではリリース時には評価されません。そのためconditionにメソッドを記述すると、リリース時には呼び出されなくなります。
[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"
条件に一致したときに、情報をリスナーに書き込めます。
public static void WriteIf (bool condition, object value);
このときconditionはリスナーに書き込むかどうかを決定するだけで、それがfalseであってもvalueはつねに評価されます。
int[] a = null;
if (a != null) Debug.Write(a.Length);
Debug.WriteIf(a != null, a.Length); // NullReferenceException「オブジェクト参照がオブジェクト インスタンスに設定されていません。」
型 | プロパティ | 内容 |
---|---|---|
TraceListenerCollection | Listeners | トレース出力を監視しているリスナーのコレクション |
[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)]で実行されている }
メソッドにConditionalAttribute属性を指定することで、そのメソッドがデバッグ以外では呼び出されないようにコンパイラに指示できます。
既定では、C#からC++のコードをデバッガで追えません。C++のコードへ入ろうとすると、「デバッグ対象の言語 C++ は、現在のデバッガー設定と互換性がありません。この構成を変更するには、[ツール] メニューの [オプション] をクリックし、[デバッグ] をクリックして、[全般] の [マネージ互換モードの使用] チェック ボックスをオンにしてから、デバッグ セッションを再開してください。」として拒否されます。
この[マネージ互換モードの使用]をチェックするとC++をデバッグできるようになりますが、エディット コンティニュが無効となります。
C++を含むコードのデバッグ時にC++から例外が投げられると、「vshost32.exe は動作を停止しました」として強制終了させられることがあります。その場合にはVisual Studioのオプションの[デバッグ]で、[ネイティブ互換モードの使用]をチェックします。