PInvokeStackImbalance MDA

Note

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 PInvokeStackImbalance asistente de depuración administrada (MDA) se activa cuando CLR detecta que la profundidad de la pila después de una llamada de invocación de plataforma no coincide con la profundidad de pila esperada, dada la convención de llamada especificada en el DllImportAttribute atributo y la declaración de los parámetros en la firma administrada.

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

Note

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

Síntomas

Una aplicación encuentra una infracción de acceso o daños en la memoria al realizar o seguir una llamada de invocación de plataforma.

Causa

Es posible que la firma administrada de la llamada de invocación de plataforma no coincida 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 DllImportAttribute atributo , no coincide con la convención de llamada no administrada.

Resolución

Revise la convención de llamada y firma de invocación de plataforma administrada para confirmar que coincide con la convención de firma y llamada del destino nativo. Intente especificar explícitamente la convención de llamada en los lados administrados y no administrados. También es posible, aunque no lo más probable, que la función no administrada desequilibró la pila por algún otro motivo, como un error en el compilador no administrado.

Efecto en el tiempo de ejecución

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

Output

El mensaje MDA proporciona el nombre de la llamada al método de invocación de plataforma que está causando 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 "SampleMethod" de PInvoke ha desequilibrado la pila. Esto es probable porque la firma de PInvoke administrada no coincide con la firma de destino no administrada. Compruebe que la convención de llamada y los parámetros de la firma PInvoke coinciden con la firma no administrada de destino.

Configuration

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

Consulte también