分享方式:


PInvokeStackImbalance MDA

注意

本文專屬於 .NET Framework。 它不適用於較新的 .NET 實作,包括 .NET 6 和更新版本。

PInvokeStackImbalance當 CLR 偵測到平台調用呼叫之後堆疊深度不符合預期的堆疊深度時,就會啟動 Managed 偵錯助理 (MDA),因為指定的呼叫慣例DllImportAttribute是在 屬性中指定的,以及 Managed 簽章中參數的宣告。

PInvokeStackImbalance MDA 只會在 32 位元 x86 平台上實作。

注意

PInvokeStackImbalance預設會停用 MDA。 在 Visual Studio 2017 和更新版本中,PInvokeStackImbalanceMDA 會出現在 [例外狀況設定] 對話方塊中的 [Managed Debug Assistants] 清單中(當您選取 >[偵錯 Windows>例外狀況設定] 時顯示。 不過,選取或清除 [擲回 時中斷] 複選框不會啟用或停用 MDA;它只會控制 Visual Studio 是否在啟用 MDA 時擲回例外狀況。

徵兆

應用程式在進行平台叫用呼叫期間或之後發生存取違規或記憶體損毀。

原因

平台叫用呼叫的 Managed 簽章可能與所呼叫之方法的 Unmanaged 簽章不符。 當 Managed 簽章未宣告正確的參數數目,或未指定適當的參數大小時,便會造成這種不相符狀況。 MDA 也可能由於呼叫慣例 (可能由 DllImportAttribute 屬性指定) 與 Unmanaged 呼叫慣例不符而啟動。

解決方法

檢閱 Managed 平台叫用簽章和呼叫慣例,確認其與原生目標的簽章和呼叫慣例相符。 嘗試明確指定 Managed 和 Unmanaged 端的呼叫慣例。 Unmanaged 函式也可能 (雖然可能性不高) 因其他一些原因而使堆疊失去平衡,例如 Unmanaged 編譯器中的 Bug。

對執行階段的影響

強制所有平台叫用呼叫採用 CLR 中未最佳化的路徑。

輸出

MDA 訊息會提供使堆疊失去平衡之平台叫用方法呼叫的名稱。 SampleMethod 方法之平台叫用呼叫的範例訊息為:

對 PInvoke 函式 'SampleMethod' 的呼叫已使堆疊不平衡。 這可能是因為受控 PInvoke 簽章不符合非受控目標籤章。 檢查 PInvoke 簽章的呼叫慣例和參數是否符合目標非受控簽章。

組態

<mdaConfig>
  <assistants>
    <pInvokeStackImbalance />
  </assistants>
</mdaConfig>

另請參閱