다음을 통해 공유


PInvokeStackImbalance MDA

참고 항목

이 문서는 .NET Framework와 관련이 있습니다. .NET 6 이상 버전을 포함하여 .NET의 최신 구현에는 적용되지 않습니다.

PInvokeStackImbalance MDA(관리 디버깅 도우미)는 DllImportAttribute 특성에 지정된 호출 규칙과 관리 서명에서 매개 변수 선언을 기준으로 CLR에서 플랫폼 호출 후의 스택 깊이가 예상 스택 깊이와 일치하지 않음을 감지할 때 활성화됩니다.

PInvokeStackImbalance MDA는 32비트 x86 플랫폼에 대해서만 구현됩니다.

참고 항목

PInvokeStackImbalance MDA는 기본적으로 사용하지 않도록 설정됩니다. Visual Studio 2017 이상 버전에서 PInvokeStackImbalance MDA는 예외 설정 대화 상자의 관리 디버깅 도우미 목록에 나타납니다. 대화 상자는 디버그>Windows>예외 설정을 선택할 때 표시됩니다. 그러나 Throw되었을 때 중단 확인란을 선택하거나 선택 취소해도 MDA가 사용하거나 사용하지 않도록 설정되지는 않습니다. MDA가 활성화될 때 Visual Studio에서 예외를 발생시키는지 여부만 제어합니다.

증상

애플리케이션이 플랫폼 호출을 수행할 때나 이후에 액세스 위반 또는 메모리 손상을 발견합니다.

원인

플랫폼 호출의 관리되는 서명이 호출되는 메서드의 관리되지 않는 서명과 일치하지 않을 수 있습니다. 이 불일치는 관리되는 서명에서 올바른 개수의 매개 변수를 선언하지 않았거나 매개 변수에 대해 적절한 크기를 지정하지 않아서 발생할 수 있습니다. DllImportAttribute 특성에 지정될 수 있는 호출 규칙이 관리되지 않는 호출 규칙과 일치하지 않아 MDA가 활성화될 수도 있습니다.

해결

관리되는 플랫폼 호출 서명과 호출 규칙을 검토하여 기본 대상의 서명 및 호출 규칙과 일치하는지 확인합니다. 관리되는 측면과 관리되지 않는 측면 둘 다에서 호출 규칙을 명시적으로 지정합니다. 가능성은 적지만 관리되지 않는 컴파일러의 버그와 같은 다른 이유로 관리되지 않는 함수에서 스택 불균형이 발생했을 수도 있습니다.

런타임에 대한 영향

모든 플랫폼 호출이 CLR에서 최적화되지 않은 경로를 사용하도록 강제합니다.

출력

MDA 메시지는 스택 불균형을 발생시키는 플랫폼 호출 메서드 호출의 이름을 제공합니다. SampleMethod 메서드의 플랫폼 호출 샘플 메시지는 다음과 같습니다.

PInvoke 함수 ‘SampleMethod’에 대한 호출이 스택의 균형을 해제했습니다. 관리되는 PInvoke 서명이 관리되지 않는 대상 서명과 일치하지 않기 때문일 수 있습니다. PInvoke 서명의 호출 규칙 및 매개 변수가 관리되지 않는 대상 서명과 일치하는지 확인합니다.

구성

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

참고 항목