gcManagedToUnmanaged MDA
每當執行緒從 Mananged 轉換到 Unmanaged 程式碼時,gcManagedToUnmanaged Managed 偵錯助理 (MDA) 就會造成記憶體回收。
症狀
嘗試使用已經公開至 COM 的 Managed 物件時,Unmanaged 使用者元件會擲回存取違規。 COM 物件看起來似乎已經釋放。 此存取違規屬於非決定性的違規。
原因
如果 Unmanaged 元件沒有正確地參考計數 (Reference Counting) Managed COM 物件,當 Unmanaged 元件仍然持有該物件的參考時,執行階段可能會回收公開至 COM 的 Managed 物件。 執行階段會在進行記憶體回收期間呼叫 Release,因此,如果使用者元件在發生記憶體回收之前使用物件,該物件將不會遭到回收。 這就是非決定性的來源。
解決方式
啟用這個助理會減少物件適合回收和呼叫 Release 之間的時間,有助於追蹤哪個 Unmanaged 元件先嘗試存取回收的物件。
對執行階段的影響
每當執行緒從 Managed 轉換到 Unmanaged 程式碼時,都會造成記憶體回收。
Output
這個 MDA 不會產生輸出。
組態
<mdaConfig>
<assistants>
<gcManagedToUnmanaged/>
</assistants>
</mdaConfig>