次の方法で共有


pInvokeStackImbalance MDA

更新 : 2007 年 11 月

pInvokeStackImbalance マネージ デバッグ アシスタント (MDA: Managed Debugging Assistant) は、プラットフォーム呼び出し後のスタックの深さが、予測されたスタックの深さと一致していないことを CLR が検出するとアクティブ化されます。ただし、DllImportAttribute 属性で呼び出し規則が指定され、マネージ シグネチャでパラメータの宣言が指定されていることを前提とします。

0htdy0k3.alert_note(ja-jp,VS.90).gifメモ :

pInvokeStackImbalance MDA は、32 ビットの x86 プラットフォーム専用に実装されています。

0htdy0k3.alert_note(ja-jp,VS.90).gifメモ :

.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>

参照

概念

マネージ デバッグ アシスタントによるエラーの診断

相互運用マーシャリングの概要

参照

MarshalAsAttribute

その他の技術情報

相互運用性