76

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

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

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

のようなものを期待してDebug.Break()いましたが、存在しないようです (.NET の新しいバージョンでない限り?)、他のDebug方法も適用できないようです。

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

4

7 に答える 7

137

あなたはおそらく次のようなものを求めています:

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

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

于 2008-12-12T00:02:20.277 に答える
13

これがうまくいかない状況に一度遭遇しました

System.Diagnostics.Debugger.Break();

しかし、これはした

System.Diagnostics.Debugger.Launch();
于 2008-12-11T23:58:57.910 に答える
12

System.Diagnostics.Debugger.Break?

于 2008-12-11T23:56:42.050 に答える
4

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

これを行う:

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

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

詳細については、こちらをご覧ください。

于 2008-12-12T00:02:41.820 に答える
4

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

于 2008-12-12T08:12:19.710 に答える
1

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

于 2011-11-22T20:52:53.847 に答える