C#のデバッグ

DebugとTraceクラスのメソッドの比較

DebugとTraceクラスには、共通するメソッドが多くあります。

Debugクラスのメソッドはリリース ビルドでは無視されますが、Traceの方はリリースでも評価されます。ただしこれは既定の動作であり、"DEBUG"、"TRACE"シンボルの定義によって変わります。解説 - Debug クラス (System.Diagnostics) | MSDN

DebugとTraceのメソッドの比較
Debug Trace
Assert()
Close()
× Equals()
Fail()
Flush()
× GetHashCode()
× GetType()
Indent()
Print() ×
× Refresh()
× ToString()
× TraceError()
× TraceInformation()
× TraceWarning()
Unindent()
Write()
WriteIf()
WriteLine()
WriteLineIf()

Debugクラス

プロパティ

プロパティ 内容
TraceListenerCollection Listeners デバッグ出力を監視するリスナーのコレクション
     

Listeners

Debug.Listeners.Clear()としてリスナーの登録を解除すると、評価に失敗してもメッセージ ボックスは表示されなくなります。Assert(Boolean) - Debug.Assert Method (System.Diagnostics) | Microsoft Learn

メソッド

メソッド - Debug クラス (System.Diagnostics) | MSDN

Assert()

[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にメソッドを記述すると、リリース時には呼び出されなくなります。

Fail()

[ConditionalAttribute("DEBUG")]
public static void Fail(
    string message
)
Debug.Fail メソッド (String) (System.Diagnostics) | MSDN

無条件にエラーメッセージを表示します。予期しないブロックに処理が到達したときに、それを通知できます。

Write() (デバッガへの出力)

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
Debug.Write Method (System.Diagnostics) | MSDN

WriteLine()

メソッド
WriteLine(object value)
WriteLine(object value, string category)
WriteLine(string message)
WriteLine(string message, string category)
WriteLine(string format, params object[] args)
Debug.WriteLine Method (System.Diagnostics) | MSDN
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"

WriteIf()

条件に一致したときに、情報をリスナーに書き込めます。

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「オブジェクト参照がオブジェクト インスタンスに設定されていません。」

Traceクラス

プロパティ

プロパティ 内容
TraceListenerCollection Listeners トレース出力を監視しているリスナーのコレクション
     

メソッド

  • Assert()
  • Close()
  • Equals()
  • Fail()
  • Flush()
  • GetHashCode()
  • GetType()
  • Indent()
  • Refresh()
  • ToString()
  • TraceError()
  • TraceInformation()
  • TraceWarning()
  • Unindent()
  • Write()
  • WriteIf()
  • WriteLine()
  • WriteLineIf()
メソッド - Trace クラス (System.Diagnostics) | MSDN

Assert()

[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

プログラム側から、デバッガがアタッチされているか確認できます。Debugger.IsAttached Property (System.Diagnostics) | Microsoft Learn

if (System.Diagnostics.Debugger.IsAttached)
{
    // [デバッグの開始 (Start Debugging)]で実行されている
}
else
{
    // [デバッグなしで開始 (Start Without Debugging)]で実行されている
}

デバッグ時にだけ実行するメソッドの定義

メソッドにConditionalAttribute属性を指定することで、そのメソッドがデバッグ以外では呼び出されないようにコンパイラに指示できます。

混合モードのデバッグ (mixed-mode debugging)

既定では、C#からC++のコードをデバッガで追えません。C++のコードへ入ろうとすると、「デバッグ対象の言語 C++ は、現在のデバッガー設定と互換性がありません。この構成を変更するには、[ツール] メニューの [オプション] をクリックし、[デバッグ] をクリックして、[全般] の [マネージ互換モードの使用] チェック ボックスをオンにしてから、デバッグ セッションを再開してください。」として拒否されます。

この[マネージ互換モードの使用]をチェックするとC++をデバッグできるようになりますが、エディット コンティニュが無効となります。

「vshost32.exe は動作を停止しました」

C++を含むコードのデバッグ時にC++から例外が投げられると、「vshost32.exe は動作を停止しました」として強制終了させられることがあります。その場合にはVisual Studioのオプションの[デバッグ]で、[ネイティブ互換モードの使用]をチェックします。

Microsoft Learnから検索