pInvokeStackImbalance MDA
pInvokeStackImbalance マネージ デバッグ アシスタント (MDA: Managed Debugging Assistant) は、プラットフォーム呼び出し後のスタックの深さが、予測されたスタックの深さと一致していないことを CLR が検出するとアクティブ化されます。ただし、DllImportAttribute 属性で呼び出し規則が指定され、マネージ シグネチャでパラメーターの宣言が指定されていることを前提とします。
メモ |
---|
pInvokeStackImbalance MDA は、32 ビットの x86 プラットフォーム専用に実装されています。 |
メモ |
---|
.NET Framework Version 3.5 では、pInvokeStackImbalance MDA は既定で無効になっています。.NET Framework Version 3.5 を Visual Studio 2005 と共に使用すると、[例外] ダイアログ ボックス ([デバッグ] メニューの [例外] をクリックすると表示される) の [マネージ デバッグ アシスタント] の一覧に pInvokeStackImbalance MDA が表示されます。ただし、pInvokeStackImbalance の [スローされるとき] チェック ボックスをオンまたはオフにしても、MDA を有効または無効にすることはできません。このチェック ボックスは、MDA がアクティブ化されたときに Visual Studio が例外をスローするかどうかを制御するだけです。 |
症状
アプリケーションでは、プラットフォーム呼び出しが実行されたとき、またはその後で、アクセス違反やメモリ破損が発生します。
原因
プラットフォーム呼び出しのマネージ シグネチャが、呼び出されているメソッドのアンマネージ シグネチャと一致していないことが考えられます。 マネージ シグネチャで正しい数のパラメーターが宣言されていないか、パラメーターに適切なサイズが指定されていないために、この不一致が発生する場合があります。 DllImportAttribute 属性で指定された可能性がある呼び出し規約がアンマネージ呼び出し規約と一致しないために、MDA がアクティブ化されることもあります。
解決策
マネージ プラットフォーム呼び出しシグネチャおよび呼び出し規約が、ネイティブ ターゲットのシグネチャおよび呼び出し規約に一致することを確認します。 マネージ側およびアンマネージ側の両方で、呼び出し規約を明示的に指定するように試みます。 また、めったにないことですが、アンマネージ コンパイラのバグなどのなんらかの理由により、アンマネージ関数がスタックのバランスを崩している可能性も考えられます。
ランタイムへの影響
すべてのプラットフォーム呼び出しで、CLR の最適化されていないパスが使用されるように強制します。
出力
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>