Share via


MDA de pInvokeStackImbalance

El asistente para la depuración administrada (MDA) de pInvokeStackImbalance se activa cuando CLR detecta que la profundidad de la pila tras una llamada de invocación de plataforma no coincide con la profundidad de pila esperada, dada la convención de llamada especificada en el atributo DllImportAttribute así como la declaración de los parámetros de la firma administrada.

NotaNota

El MDA de pInvokeStackImbalance sólo se implementa en plataformas x86 de 32 bits.

NotaNota

En .NET Framework 3.5, el MDA de pInvokeStackImbalance está deshabilitado de forma predeterminada.Cuando se utiliza .NET Framework 3.5 con Visual Studio 2005, el MDA de pInvokeStackImbalance aparecerá en la lista Asistentes para la depuración administrada en el cuadro de diálogo Excepciones (que se muestra al hacer clic en Excepciones en el menú Depurar).Sin embargo, activar o desactivar la casilla Producida para pInvokeStackImbalance no habilita ni deshabilita el MDA; sólo 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 una llamada de invocación de plataforma o tras la realización de dicha llamada.

Motivo

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 ha llamado. La causa de esta falta de correspondencia puede ser que la firma administrada no declare el número correcto de parámetros o que no especifique el tamaño adecuado de los parámetros. El MDA también puede activarse si la convención de llamada, posiblemente especificada por el atributo DllImportAttribute, no coincide con la convención de llamada no administrada.

Resolución

Compruebe la firma de invocación de plataforma y la convención de llamada administradas para confirmar que coinciden con la firma y la convención de llamada del destino nativo. Intente resolverlo especificando explícitamente la convención de llamada tanto en la firma administrada como en la no administrada. También es posible, aunque no probable, que la función no administrada haya desequilibrado la pila por algún otro motivo, como un error en el compilador no administrado.

Efecto en tiempo de ejecución

Obliga a todas las llamadas de invocación de plataforma a tomar la ruta de acceso no optimizada en el 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. A continuación, se muestra un ejemplo de mensaje de una llamada de invocación de plataforma en el método 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.

Configuración

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

Vea también

Referencia

MarshalAsAttribute

Conceptos

Diagnóstico de errores con ayudantes de depuraciones administradas

Cálculo de referencias de interoperabilidad

Otros recursos

Interoperabilidad