contextSwitchDeadlock MDA

Note

本文專指 .NET 框架。 此規定不適用於較新的 .NET 實作,包括 .NET 6 及更新版本。

contextSwitchDeadlock當嘗試進行 COM 上下文轉換時偵測到死結,管理除錯助理(MDA)會被啟動。

Symptoms

最常見的症狀是,從受管程式碼呼叫非受管 COM 元件時,無法回傳。 另一個症狀是記憶體使用量隨時間增加。

原因

最可能的原因是單執行緒公寓(STA)執行緒沒有發送訊息。 STA 執行緒要麼在未發送訊息的情況下等待,要麼正在執行冗長的操作,導致訊息佇列無法被抽取。

記憶體使用量隨時間增加,是因為終結執行緒嘗試呼叫 Release 未受管理的 COM 元件,但該元件未回傳。 這會防止終結者收回其他物件。

預設情況下,Visual Basic 主控台應用程式的主執行緒執行緒模型是 STA。 當 STA 執行緒透過公共語言執行時或第三方控制直接或間接使用 COM 互通性時,該 MDA 會被啟動。 為了避免在 Visual Basic 主控台應用程式中啟動此 MDA,請將該MTAThreadAttribute屬性套用到主方法,或將應用程式修改為 pump 訊息。

當滿足以下所有條件時,此 MDA 有可能被誤激活:

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

  • 應用程式在除錯器中停止,使用者則繼續執行或執行步進操作。

  • 未啟用非管理除錯。

要判斷 MDA 是否被誤啟,請停用所有中斷點,重新啟動應用程式,並允許其不停止地執行。 如果MDA未被激活,則很可能最初的活化是假的。 此時,請停用 MDA,以避免干擾除錯會話。

Note

這個 MDA 是 Visual Studio 預設的設定。 關於如何停用 MDA 的資訊,請參閱 「使用受管除錯助理診斷錯誤」。

解決方法

請遵守 COM 關於 STA 訊息流傳的規則。

對運行時間的影響

此 MDA 對 CLR 沒有影響。 它只報告關於 COM 情境的資料。

Output

一則描述當前上下文與目標上下文的訊息。

Configuration

<mdaConfig>
  <assistants>
    <contextSwitchDeadlock />
  </assistants>
</mdaConfig>

另請參閱