共用方式為


contextSwitchDeadlock MDA

更新:2007 年 11 月

在嘗試轉換 COM 內容期間偵測到死結 (Deadlock) 時,contextSwitchDeadlock Managed 偵錯助理 (MDA) 就會啟動。

症狀

最常見的症狀,就是從 Managed 程式碼到 Unmanaged 程式碼的呼叫沒有傳回。另一種症狀則是記憶體使用量隨著時間逐漸增加。

原因

最可能的原因,就是單一執行緒 Apartment (STA) 執行緒沒有提取訊息。STA 執行緒在等候時未提取訊息,或者在執行漫長作業時不允許提取訊息佇列。

當完成項執行緒嘗試對 Unmanaged 元件呼叫 Release,而該元件卻沒有傳回時,就會造成記憶體使用量隨著時間逐漸增加。如此,完成項便無法回收其他的物件。

根據預設,Visual Basic 主控台應用程式主執行緒的執行緒模型是 STA。如果 STA 執行緒直接或間接地透過 Common Language Runtime 或協力廠商控制項使用 COM 互通性 (Interoperability),就會啟動此 MDA。若要避免在 Visual Basic 主控台應用程式中啟動此 MDA,請將 MTAThreadAttribute 屬性 (Attribute) 套用至 Main 方法,或修改應用程式以提取訊息。

在符合下列所有條件時,就可能錯誤地啟動這個 MDA:

  • 應用程式直接或間接地透過程式庫從 STA 執行緒建立 COM 元件。

  • 應用程式已在偵錯工具中停止,而使用者繼續執行應用程式或執行逐步偵錯作業。

  • 未啟用 Unmanaged 偵錯。

若要判斷是否錯誤啟動了 MDA,請停用所有的中斷點,重新啟動應用程式,然後讓它不中斷地執行。如果 MDA 未啟動,就可能是初始啟動發生了錯誤。在這種情況下,請停用 MDA 以避免干擾偵錯工作階段。

注意事項:

這個 MDA 位於 Visual Studio 2005 (含) 以後版本的預設集合中。當裝載處理序已在 Visual Studio 內啟用時,您就無法停用位於預設集合內的 MDA。預設為啟用裝載處理序,所以必須明確停用。如需如何停用 MDA 的詳細資訊,請參閱診斷 Managed 偵錯助理的錯誤中的<啟用及停用 MDA>一節。

解決方式

遵循有關 STA 訊息提取的 COM 規則。

對執行階段的影響

這個 MDA 對 CLR 無效。它只會報告有關 COM 內容的資料。

輸出

描述目前內容和目標 (Target) 內容的訊息。

組態

<mdaConfig>
  <assistants>
    <contextSwitchDeadlock enable="false" />
  </assistants>
</mdaConfig>

請參閱

概念

診斷 Managed 偵錯助理的錯誤

Interop 封送處理概觀

參考

MarshalAsAttribute

其他資源

互通性