2017-11-27 11 views
0

.NETVisual Studio 2017でデバッグしている場合、デバッガコンテキストによってコードが呼び出されているかどうか、つまりブレークポイントで停止したときにコードを検出する方法はありますか。VSデバッガがブレークポイントで停止していることを検出していますか?

私は、これはfunc-evalコンテキスト(here以上)として知られていると信じて、あなたはブレークポイントを停止し、デバッガが自動的におけるプロパティ値に(有効な場合)ToString()結果を表示するために、あなたのコードを呼び出したときにそれが起こります地方自動車などのウィンドウを表示し、停止中に入力した任意の機能を評価することもできます。

私はDebugger.IsAttachedを認識していますが、これは同じではありません。デバッガがコール時に停止または実行されているかどうかにかかわらず、プロセスがデバッグ中かどうかを示します。この質問はより具体的なケースを求めています:Debugger.IsAttachedtrueでなければなりませんが、それはデバッガのfunc-evalコンテキストにいるかどうかを示すものではないため、十分ではありません。

これはちょうど単純なグローバルboolの値であるはずなので、解決策にはCOMコール(つまりICorDebugAppDomain)が含まれないことが期待されます。それはFUNC-EVALによって呼び出されていた場合

+0

私がよく知っているのは、条件付きブレークポイントを使用してVSデバッガがブレークポイントで停止しているかどうかを確認することです。https://blogs.msdn.microsoft.com/devops/2014/ 10/06/new-breakpoint-configuration-in-visual-studio-2015/ –

答えて

1

号は、コードがわかりません。一般的に、デバッガの下ではコードが違うように振る舞う必要はありませんが、デバッグにはひどく難しい問題が発生します。

func-evalsを回避しようとする場合は、DebuggerDisplay属性を使用できます。 あなたはFUNC-EVALを中止し、デバッガを知らせるためにDebugger.NotifyOfCrossThreadDependency()を使用することができます。 (詳細はhttps://blogs.msdn.microsoft.com/eliofek/2012/12/12/why-do-we-get-the-function-evaluation-requires-all-threads-to-run/を参照してください)

+0

この情報をお寄せいただきありがとうございます。ここでの唯一のユースケースは、***アプリケーション用ですので、わからない「このような検出を提供することが(おそらく、*** ***デバッガ開発者向け) 『のデバッグに恐ろしく困難な問題につながる』だろう」という正当化は*、保証されて**開発者は*デバッガ*バグを回避する!例えば、ボクシングやリモーティングによって本質的に損なわれた価値タイプの設計/シナリオをデバッグする無数の問題(特に、これらのために、 'DebuggerTypeProxy'は事態を悪化させるだけです)。 –

+0

私は*アプリケーション*開発者について話していました。デバッガの下でアプリケーションを実行したときにアプリの動作が異なると、アプリケーション開発者が本番の問題をデバッグするのが難しくなる可能性があります。私たちは、これらの "heisenbugs"と呼ばれる。 –

+0

ああ、そうだ。明確化のおかげで、私は確かにそのコンセンサスに同意します。しかし、ポイントは上記の私のコメントから残っています。つまり、* func-eval *を検出する簡単な方法がないと、アプリ開発者が正当な、正当な、十分に理解されたデバッガの問題や制限を回避することが難しくなります。皮肉なことに(または強情)、ここでは簡単な指標の欠如が不必要にそれが*難しい完全生産ビルドの*から、このような汚染を維持すること、必要な最終的なアプリレベルデバッガの回避策に追加複雑さとスプロールを引き起こす可能性があります。 –

関連する問題