2009-07-21 15 views
3

単体テストを実行しているときに、以下に示すMDAを取得しています。'ContextSwitchDeadlock' MDAメッセージで参照される 'COMコンテキスト'とは何ですか?

エラーメッセージでは、「COMコンテキスト」と呼ばれる16進値は何ですか?

特定のSTAスレッドに対してこの値を決定できますか?もしそうなら、どうですか?デバッグアシスタント 'ContextSwitchDeadlock' マネージド

で 問題を検出しました 'C:\プログラムファイル\のMicrosoft Visual Studioの 9.0 \ Common7 \ IDE \のvstesthost.exe' を。追加情報:CLRが 60秒間COM コンテキスト0x14cff0にCOMコンテキスト 0x14d218から移行することができませんでした。先 コンテキスト/アパートを所有するスレッド は、最も可能性の高い いずれかの非常に長いのWindowsに メッセージをポンプなし 操作を実行している処理以外のポンピング待ちや をやっています。この状況は一般的に に悪影響を及ぼし、 は、アプリケーションが 応答しなくなったり、メモリ使用量が になったりすることがあります。この問題を回避する に、すべてのシングル スレッドアパートメント(STA)は が待ちプリミティブに(例えばCoWaitForMultipleHandlesなど) をポンプに使用するスレッドと 日常長い 実行する操作中にメッセージを送り出します。

答えて

2

私は見ることができます(mscorwksの分解を見て)IObjContext*で、返されたものはCoGetContextToken()です。

IContextCallback::ContextCallback()からコールがキューに入れられ、オブジェクトコンテキスト(アパートメント)がメッセージを処理すると、mscorwks!CtxEntry::EnterContextCallback()が呼び出されます。彼らは、コールバックの完了を通知するためにCLREventを使用します。 STAスレッドの場合、メッセージをポンピングしないとイベント待ち時間がタイムアウトになり、ContextSwitchDeadlock MDAがトリガーされます。

注:私はデバッガの下でこれを実行していないので、動作を確認することはできませんが、これはおそらく合理的に正確です。

+0

おそらく、合理的に正確な私のために十分です:) – mackenir

0

私はこれまでに見たことがないが、それは内部ポインタだと思う。スレッドIDもスレッドハンドルも通常はそれほど大きくありません。

現在のスレッドからアパートメントタイプを取得する方法はなく、ネイティブコードでアパートメントID(マーシャリング時にソース/ターゲットアパートメントを表すGUID以外)を見たことはありません。

0

単体テストはMTAモードで実行されている可能性が高く、その中にUIを表示するコードがあります。 1つのCOMコンテキストはVisual Studioであり、もう1つはユニットテスト内のUIです。 UIを表示したり、MDAをオフにしたりすることはできません。

+0

単体テストは非GUIであり、STAで動作するように構成されています。 – mackenir

+0

問題のUIは、あなたのコードではなくテストランナーにとってネイティブかもしれません。私は単体テストでリソース集約的なコードを実行しているときに問題のMDAを見てきましたが、VSは接続プロセスからのアップデートを求めています。 –

+0

私はMDAが発生している理由を知っていると思いますが(私はファイナライザからSTAスレッドにクロススレッドCOMコールを行います)、MDAエラーメッセージのマジックナンバーが何らかの方法で診断することができるかどうかを知りたい本物の問題が検出された場合に備えて – mackenir

0

STA COMアプリケーションがメッセージループをスピンしないようです。これはSTA COMがちょうど死に至る原因になります。私はCOMのコンテキストが何であるか分かりませんが、長時間ハングアップするだけで目的のアプリを再現できるはずです。

実行に60秒以上かかる機能があるような音がします。あなたはそれを分離することができましたか?

EDITこれは、COM interop for .NETを作成したユーザーです。

http://blogs.msdn.com/cbrumme/

彼のブログを見てくださいか、彼は常連のボードをチェックしてください。彼はなぜCOMがそれと同じ方法で相互作用するのかについて多くのことを書いています。マイクロソフトのボードの1つでこの質問をすると役に立ちます。

+0

ええ、それはどこかでサービスされていないCOMメッセージループです。しかし、私は16進数が何を指しているのか、それを診断に使うことができるかどうか疑問に思っていました。 – mackenir

関連する問題