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クラス

メソッド

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

Assert()

[ConditionalAttribute("DEBUG")]
public static void Assert(
    bool condition
)
Debug.Assert メソッド (System.Diagnostics) | MSDN

conditionがfalseのとき、メッセージボックスで呼び出し履歴 (Call stack) を表示します。

DebugクラスのAssert()はTraceのそれとは異なり、既定ではリリース時には評価されません。そのためconditionにboolを返すメソッドを記述すると、リリース時には呼び出されなくなります。

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"

Traceクラス

メソッド

  • 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)]で実行されている
}

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

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

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

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

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

Microsoft Learnから検索