contextSwitchDeadlock MDA

在嘗試轉換 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 內容的資料。

Output

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

組態

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

請參閱

參考

MarshalAsAttribute

概念

診斷 Managed 偵錯助理的錯誤

Interop 封送處理

其他資源

互通性