web-dev-qa-db-ja.com

.NETソースコードはデバッグブレークポイントをハードコーディングできますか?

デバッガーで特定のブレークポイントを設定することを忘れずに、その時点でブレークポイントが設定されたようにデバッグブレークをトリガーするソースコードの.NET(特に2.0、C#)の方法を探しています。実稼働ランタイムを妨げることなく。

私たちのコードは、私たちにリンクしているクライアントアプリケーションを混乱させないように、実稼働環境で例外を飲み込む必要がありますが、デバッガで実行されている場合にそのようなエラーがポップアップして分析されるように設定しようとしています、その他は無視されます。

Debug.Assert(false)を使用しようとする試みは理想的とは言えず、Debug.Fail()は同じように動作すると思います。理論的には本番では効果がなく、デバッグ時に正常に停止しますが、実際のブレークポイントでできるように、そのエラーを無視したい場合、設計上(実行できる限り)実行を継続する方法はありません、そしてそれが私たちがエラーを飲み込む生産で行うように。また、デバッガーは実際にはネイティブシステムコードではなくネイティブシステムコードで停止するため、変数の状態の評価を中断するようです。したがって、デバッグヘルプは制限されています。 (たぶん、変数に戻って、それが起こった場所などを見るために、何かに戻る方法が欠けているのかもしれません。???)

私はDebug.Break()のようなものを望んでいましたが、それは存在しないようです(おそらく.NETの後のバージョンにない限り)。また、他のDebugメソッドも適用できないようです。

更新: ctackeの答えは私が探していたものに最適ですが、それ以来Debug.Assert()でのトリックも発見しました-デバッガーで実行しているときに-デバッガーを一時停止し、保留中のDebug.Assert呼び出しのコード(フレームワークコードでダウンしているため緑色で強調表示)に移動し、Step-Out(shift-F11)を押してから、アサートダイアログボックスで[無視]を押します。これにより、アサートの戻り時にデバッガーが一時停止したままになります(無視されたため、発生していないかのように実行を継続できます)。同じことを行う方法は他にもあるかもしれませんが(Retryを押すと、これがより直接行われますか?)、この方法は直感的でした。

69
Rob Parker

あなたはおそらく次のようなものの後です:

if(System.Diagnostics.Debugger.IsAttached)
  System.Diagnostics.Debugger.Break();

もちろん、それはリリースビルドでコンパイルされます。リリースビルドにコードが存在しないデバッグオブジェクトのように動作させるには、次のようにします。

    // Conditional("Debug") means that calls to DebugBreak will only be
    // compiled when Debug is defined. DebugBreak will still be compiled
    // even in release mode, but the #if eliminates the code within it.
    // DebuggerHidden is so that, when the break happens, the call stack
    // is at the caller rather than inside of DebugBreak.
    [DebuggerHidden]
    [Conditional("DEBUG")] 
    void DebugBreak()
    {
        if(System.Diagnostics.Debugger.IsAttached)
            System.Diagnostics.Debugger.Break();
    }

次に、コードに呼び出しを追加します。

127
ctacke

System.Diagnostics.Debugger.Break

12
shahkalpesh

4ではなく1行のコードのみを使用する場合は、ラップします

#if DEBUG
       if (Debugger.IsAttached)
            Debugger.Break();
#endif

public static class DebugHelper
{
    [DebuggerHidden]
    [Conditional("DEBUG")]
    public static void Stop()
    {
       if (Debugger.IsAttached)
            Debugger.Break();
    }
}

そして使用

DebugHelper.Stop();

DebuggerHiddenAttributeは、デバッガーがStopメソッドの内部コードで停止し、F11を使用してメソッドにステップインするのを防ぐために追加されました。

10
Sergey

一度これがうまくいかない状況に陥った

System.Diagnostics.Debugger.Break();

しかし、これはやった

System.Diagnostics.Debugger.Launch();
9
CheGueVerra

デバッガーを飲み込んでもポップアップするようにVisual Studioを構成するのはどうですか?

これを行う:

  • [デバッグ]-> [例外]に移動します。
  • 適切な例外を見つけるか、独自の例外である場合は追加します
  • 例外の[スロー]チェックボックスをオンにします

これにより、例外が処理されない場合だけでなく、例外がスローされる場所でVisual Studioが停止します。

詳細情報を見ることができます こちら

私が見つけた素敵なトリックは、Debugger.Break()を例外のctorに入れることです。

Visual Studio 2010では、Debug.AssertダイアログでRetryを押すと、ブレークポイントがあるかのように、失敗したデバッグアサーションに移動します。

1
Aren Cambre