1. ホーム
  2. c#

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

2023-09-21 01:26:28

質問

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

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

私の試みでは Debug.Assert(false) を使おうとしていますが、あまり理想的ではありません。 Debug.Fail() が同じように動作すると仮定します。 理論的には実運用に影響はないはずで、デバッグ時には正常に停止しますが、設計上、実際のブレークポイントのようにそのエラーを無視したい場合に実行を継続する方法は(私が知る限り)なく、実運用ではエラーを飲み込んでしまうようなものなのです。 また、デバッガが実際に停止するのはネイティブのシステムコードであり、私たちのコードではないため、変数の状態の評価も壊れるようです。 (多分、私は、それが起こった変数などを見るために、物事に戻る方法を見逃しているようです。???)

私は次のようなものを望んでいました。 Debug.Break() のようなものを期待していましたが、それは存在しないようです(.NETの後のバージョンでは多分ないのでしょうか)。 Debug メソッドも適用できないようです。

更新しました。 ctackeの回答は私が探していたものに最もマッチしていますが、その後、Debug.Assert()のトリックも発見しました。デバッガで実行しているとき、デバッガを一時停止し、保留中のDebug.Assert呼び出しのコードに移動し(フレームワークコード内の下なので緑でハイライトされています)ステップアウト(シフト-F11)を押して、アサートのダイアログボックスのIgnoreを押してください。 これにより、デバッガはアサートのリターン時に一時停止します (アサートが無視されたため、アサートが発生しなかったかのように実行を続けることができます)。 同じことを行う他の方法があるかもしれませんが (再試行をヒットすると、これをより直接的に行うことができますか?)、この方法は直感的でした。

どのように解決するのですか?

おそらく、このようなことを望んでいるのでしょう。

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

もちろん、これはリリースビルドでコンパイルされます。 もし、Release ビルドではコードが存在しない Debug オブジェクトのように動作させたい場合は、次のようにします。

    // 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();
    }

そして、コードにその呼び出しを追加します。