Compartir a través de


MDA de PInvokeStackImbalance

Nota:

Este artículo es específico de .NET Framework. No se aplica a implementaciones más recientes de .NET, incluidas .NET 6 y versiones posteriores.

El asistente para la depuración administrada (MDA) PInvokeStackImbalance se activa cuando CLR detecta que la profundidad de la pila después de la llamada de invocación de plataforma no coincide con la profundidad de pila esperada, según la convención de llamada especificada en el atributo DllImportAttribute y la declaración de los parámetros en la signatura administrada.

El MDA PInvokeStackImbalance solo se implementa para plataformas de x86 de 32 bits.

Nota

El MDA PInvokeStackImbalance está deshabilitado de forma predeterminada. En Visual Studio 2017 y versiones posteriores, el MDA PInvokeStackImbalance aparece en la lista Asistentes para la depuración administrada en el cuadro de diálogo Configuración de excepciones (que se muestra al seleccionar Depurar>Windows>Configuración de excepciones). Sin embargo, seleccionar o anular la selección de la casilla Interrumpir cuando se produzca no habilita ni deshabilita el MDA; solo controla si Visual Studio inicia una excepción cuando se activa el MDA.

Síntomas

Una aplicación se encuentra con una infracción de acceso o daños en la memoria cuando se realiza una llamada de invocación de plataforma o después de realizar una.

Causa

La firma administrada de la llamada de invocación de plataforma podría no coincidir con la firma no administrada del método al que se llama. Esta falta de coincidencia puede deberse a que la firma administrada no declara el número correcto de parámetros o no especifica el tamaño adecuado para los parámetros. El MDA también puede activarse porque la convención de llamada, posiblemente especificada por el atributo DllImportAttribute, no coincide con la convención de llamada no administrada.

Solución

Revise la firma de la invocación de plataforma administrada y la convención de llamada para confirmar que coincide con la firma y la convención de llamada del destino nativo. Pruebe a especificar explícitamente la convención de llamada en ambos lados, administrado y no administrado. También es posible, aunque no probable, que la función no administrada haya desequilibrado la pila por algún otro motivo, por ejemplo, un error en el compilador no administrado.

Efecto en el Runtime

Obliga a todas las llamadas de invocación de plataforma a tomar la ruta de acceso no optimizada en CLR.

Output

El mensaje del MDA indica el nombre de la llamada al método de invocación de plataforma que causa el desequilibrio de la pila. Un mensaje de ejemplo de una llamada de invocación de plataforma en el método SampleMethod es:

Una llamada a la función de PInvoke "SampleMethod" ha desequilibrado la pila. Probablemente se deba a que la signatura PInvoke administrada no coincide con la signatura de destino no administrada. Compruebe que los parámetros y la convención de llamada de la signatura PInvoke coinciden con la signatura no administrada de destino.

Configuración

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

Consulte también