pInvokeStackImbalance MDA
當 CLR 偵測到平台叫用之後的堆疊深度,不符合由 DllImportAttribute 屬性指定之呼叫慣例所提供的預期堆疊深度,以及 Managed 簽章中的參數宣告時,pInvokeStackImbalance Managed 偵錯助理 (MDA) 就會啟動。
注意事項 |
---|
pInvokeStackImbalance MDA 只針對 32 位元 x86 平台實作。 |
注意事項 |
---|
在 .NET Framework 3.5 版中,預設為停用 pInvokeStackImbalance MDA。當您使用 .NET Framework 3.5 版和 Visual Studio 2005 時,pInvokeStackImbalance MDA 會顯示在 [例外狀況] 對話方塊中的 [Managed 偵錯助理] 清單中 (當您按一下 [偵錯] 功能表上的 [例外狀況] 時就會顯示)。但是,選擇或清除 pInvokeStackImbalance 的 [擲回] 核取方塊並不會啟用或停用 MDA,只會控制當 MDA 啟動時,Visual Studio 是否擲回例外狀況。 |
症狀
應用程式會在進行或跟隨平台叫用呼叫時,發生存取違規或記憶體損毀。
原因
平台叫用呼叫的 Managed 簽章,可能不符合所要叫用之方法的 Unmanaged 簽章。 這種不符合可能是因為 Managed 簽章未宣告正確的參數數目,或是未對參數指定適當大小所造成的。 當呼叫慣例 (可能由 DllImportAttribute 屬性指定) 不符合 Unmanaged 呼叫慣例時,這個 MDA 也會啟動。
解決方式
檢閱 Managed 平台叫用簽章和呼叫慣例,確認這些符合原生目標 (Target) 的簽章和呼叫慣例。 嘗試在 Managed 和 Unmanaged 端明確地指定呼叫慣例。 雖然可能性不高,但 Unmanaged 函式也可能因為其他一些原因 (例如 Unmanaged 編譯器中的錯誤) 而使堆疊失去平衡。
對執行階段的影響
強制所有平台叫用呼叫使用 CLR 中的非最佳化路徑。
Output
MDA 訊息會提供造成堆疊失衡的平台叫用方法呼叫的名稱。 以下是 SampleMethod 方法上平台叫用呼叫的範例訊息:
A call to PInvoke function 'SampleMethod' has unbalanced the stack.
This is likely because the managed PInvoke signature does not match
the unmanaged target signature. Check that the calling convention and
parameters of the PInvoke signature match the target unmanaged signature.
組態
<mdaConfig>
<assistants>
<pInvokeStackImbalance />
</assistants>
</mdaConfig>