pInvokeStackImbalance MDA
CLR에서 P/Invoke 호출 이후의 스택 수준이 관리 시그니처에서 매개 변수의 선언과 함께 DllImportAttribute 특성에 지정된 호출 규칙을 제공한 예상 스택 수준과 일치하지 않음을 감지하면 pInvokeStackImbalance MDA(관리 디버깅 도우미)가 활성화됩니다.
참고 |
---|
pInvokeStackImbalance MDA는 32비트 x86 플랫폼에서만 구현됩니다. |
참고 |
---|
.NET Framework 버전 3.5에서는 pInvokeStackImbalance MDA를 기본적으로 사용할 수 없습니다..NET Framework 버전 3.5를 Visual Studio 2005와 함께 사용하면 pInvokeStackImbalance MDA는 디버그 메뉴에 있는 예외를 클릭했을 때 표시되는 예외 대화 상자의 관리 디버깅 도우미 목록에 나타납니다.그러나 pInvokeStackImbalance의 Throw됨 확인란을 선택하거나 선택 취소해도 MDA를 활성화하거나 비활성화할 수는 없습니다. 이 확인란은 MDA가 활성화되었을 때 Visual Studio에서 예외를 throw하는지 여부만 제어합니다. |
증상
P/Invoke 호출을 수행하거나 따를 때 응용 프로그램에 액세스 위반이나 메모리 손상이 발견됩니다.
원인
P/Invoke 호출의 관리 시그니처가 호출 중인 메서드의 비관리 시그니처와 일치하지 않습니다. 이러한 불일치는 비관리 시그니처가 올바른 매개 변수 수를 선언하지 않거나 해당 매개 변수에 대해 적합한 크기를 지정하지 않기 때문에 발생할 수 있습니다. MDA는 DllImportAttribute 특성에 따라 지정될 수 있는 호출 규칙이 비관리 호출 규칙과 일치하지 않기 때문에 활성화될 수도 있습니다.
해결 방법
비관리 플랫폼 호출 시그니처와 호출 규칙을 검토하여 원시 대상의 시그니처 및 호출 규칙에 일치하는지 확인합니다. 관리측 및 비관리측 모두에서 호출 규칙을 명확히 지정하도록 합니다. 또한 비관리 컴파일러의 버그와 같은 기타 이유 때문에 비관리 기능이 스택을 불안정하게 한 경우도 있을 수 있습니다.
런타임 효과
모든 P/Invoke 호출에서 CLR의 최적화되지 않은 경로를 사용하도록 강제합니다.
Output
MDA 메시지에는 스택이 불안정하도록 만든 플랫폼 호출 메서드의 이름이 제공되어 있습니다. 메서드 SampleMethod에 대한 P/Invoke 호출의 샘플 메시지는 다음과 같습니다.
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>