.NETソースコードは、デバッグ用ブレークポイントをハードコーディングできますか?
質問
私は、.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();
}
そして、コードにその呼び出しを追加します。
関連
-
[解決済み】「The breakpoint will not currently be hit」を改善するには?このドキュメントにはシンボルが読み込まれていません。" という警告はどうすれば改善されますか?
-
[解決済み】WebForms UnobtrusiveValidationModeは、jqueryのScriptResourceMappingを必要とする
-
[解決済み】クロススレッド操作が有効でない。作成されたスレッド以外のスレッドからアクセスされたコントロール
-
[解決済み] 関数を終了するには?
-
[解決済み] C# - Assert()メソッドは何をするメソッドですか?今でも有用ですか?
-
[解決済み] C#がforeachで変数を再利用するのは理由があるのか?
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み] .NETコンソールアプリケーションでアプリケーションのパスを取得するにはどうすればよいですか?
-
[解決済み] ChromeでコードからJavaScriptのブレークポイントを設定する方法は?
-
[解決済み】大文字・小文字を区別しない「Contains(string)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】"出力タイプがクラスライブラリのプロジェクトは直接起動できない"
-
[解決済み】コンパイルエラー「未割り当てのローカル変数を使用しています」が発生したのはなぜですか?
-
[解決済み】Excel "外部テーブルが期待された形式ではありません。"
-
[解決済み】パディングが無効で、削除できない?
-
[解決済み】Unity 「関連するスクリプトを読み込むことができません」「Win32Exception: システムは指定されたファイルを見つけることができません"
-
[解決済み】「...は'型'であり、与えられたコンテキストでは有効ではありません」を解決するにはどうすればよいですか?(C#)
-
[解決済み】URLから画像をダウンロードする方法
-
[解決済み】IntPtrとは一体何なのか?
-
[解決済み】「namespace」なのに「type」のように使われる。
-
[解決済み】Microsoft.Extensions.LoggingからILoggerを解決することができない