Diagnóstico de errores con ayudantes de depuraciones administradas

Actualización: Julio de 2008

Los asistentes de depuración administrada (MDA) son ayudas para la depuración que funcionan en conjunción con Common Language Runtime (CLR) para proporcionar información sobre estado en tiempo de ejecución. Los asistentes generan mensajes informativos sobre eventos en tiempo de ejecución que de otra forma no pueden interceptar. Puede utilizar MDA para aislar errores de la aplicación difíciles de encontrar que aparecen al realizar la transición entre código administrado y no administrado. Puede habilitar o deshabilitar todos los MDA si agrega una clave al Registro de Windows o establece una variable de entorno. Puede habilitar MDA específicos mediante los valores de configuración de la aplicación. Puede establecer opciones de configuración adicionales para algunos MDA concretos en el archivo de configuración de la aplicación. Dado que estos archivos de configuración se analizan cuando se carga el motor en tiempo de ejecución, debe habilitar el MDA antes de que se inicie la aplicación administrada. No puede habilitarlo para aplicaciones que ya se han iniciado.

Nota:

Cuando se habilita un Ayudante para la depuración administrada (MDA), está activo aunque el código no se esté ejecutando en un depurador. Si se provoca un evento MDA cuando un depurador no está presente, el mensaje del evento se presenta en un cuadro de diálogo de excepciones no controlado, aunque no se trata de una excepción no controlada. Para evitar el cuadro de diálogo, quite las opciones que habilitan MDA cuando el código no se está ejecutando en un entorno de depuración.

Nota:

Cuando el código se ejecuta en el entorno de desarrollo integrado (IDE) de Visual Studio, puede evitar el cuadro de diálogo de excepciones que aparece con determinados eventos de MDA. Para ello, en el menú Depurar, haga clic en Excepciones. (Si el menú Depurar no contiene el comando Excepciones, haga clic en Personalizar en el menú Herramientas para agregarlo). En el cuadro de diálogo Excepciones, expanda la lista Managed Debugging Assistants y, a continuación, desactive la casilla Producida de cada Asistente para depuración administrada. Por ejemplo, para evitar el cuadro de diálogo de excepciones de MDA de contextSwitchDeadlock, desactive la casilla Producida situada junto a su nombre en la lista Managed Debugging Assistants. También puede utilizar este cuadro de diálogo para habilitar los MDA.

La tabla siguiente muestra los MDA incluidos con .NET Framework.

MDA de asynchronousThreadAbort

MDA de bindingFailure

MDA de callbackOnCollectedDelegate

MDA de contextSwitchDeadlock

MDA de dangerousThreadingAPI

MDA de dateTimeInvalidLocalFormat

MDA de dirtyCastAndCallOnInterface

MDA de disconnectedContext

MDA de dllMainReturnsFalse

MDA de exceptionSwallowedOnCallFromCom

MDA de failedQI

MDA de fatalExecutionError

MDA de gcManagedToUnmanaged

MDA de gcUnmanagedToManaged

MDA de illegalPrepareConstrainedRegion

MDA de invalidApartmentStateChange

MDA de invalidCERCall

MDA de invalidFunctionPointerInDelegate

MDA de invalidGCHandleCookie

MDA de invalidIUnknownPointer

MDA de invalidMemberDeclaration

MDA de invalidOverlappedToPinvoke

MDA de invalidVariant

MDA de jitCompilationStart

loaderLock (MDA)

MDA de loadFromContext

MDA de marshalCleanupError

MDA de marshaling

MDA de memberInfoCacheCreation

MDA de moduloObjectHashcode

MDA de nonComVisibleBaseClass

MDA de notMarshalable

MDA de openGenericCERCall

MDA de overlappedFreeError

MDA de pInvokeLog

MDA de pInvokeStackImbalance

MDA de raceOnRCWCleanup

Reentrancy

MDA de releaseHandleFailed

MDA de reportAVOnComRelease

MDA de streamWriterBufferedDataLost

MDA de virtualCERCall

De forma predeterminada, .NET Framework activa un subconjunto de MDA para todos los depuradores administrados. Para ver el valor predeterminado en Visual Studio, haga clic en Excepciones en el menú Depurar, y expanda la lista Ayudantes para la depuración administrada.

Habilitar y deshabilitar MDA

Puede habilitar y deshabilitar los MDA mediante una clave del Registro, una variable de entorno o valores de configuración de la aplicación. La clave del Registro o la variable de entorno tienen que estar habilitadas para utilizar los valores de configuración de la aplicación.

En Visual Studio 2005 y versiones posteriores, cuando se habilita el proceso de hospedaje, no se pueden deshabilitar los MDA que están en el conjunto predeterminado ni habilitar los MDA que no están en el conjunto predeterminado. De forma predeterminada, el proceso de hospedaje está habilitado, por lo que debe deshabilitarse explícitamente.

Para deshabilitar el proceso de hospedaje en Visual Studio, haga lo siguiente:

  1. En el Explorador de soluciones, seleccione un proyecto.

  2. En el menú Proyecto, haga clic en Propiedades.

    Aparece la ventana Diseñador de proyectos.

  3. Haga clic en la ficha Depurar.

  4. En la sección Habilitar depuradores, desactive la casilla Habilitar el proceso de hospedaje de Visual Studio.

Sin embargo, deshabilitar el proceso de hospedaje puede afectar al rendimiento. Para que no sea necesario deshabilitar los MDA, no permita que Visual Studio muestre el cuadro de diálogo MDA cuando se reciba una notificación de MDA. Para ello, haga clic en Excepciones en el menú Depurar, expanda la lista Ayudantes para la depuración administrada y, a continuación, active o desactive la casilla Producida del MDA individual.

Habilitar y deshabilitar utilizando una clave del Registro

Puede habilitar MDA agregando la subclave HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\MDA al Registro de Windows. Copie el ejemplo siguiente en un archivo de texto denominado "MDAEnable.reg":

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework]
"MDA"="1"

En el símbolo del sistema, ejecute el archivo MDAEnable.reg para habilitar los MDA en el equipo. Para deshabilitar los MDA, copie el ejemplo siguiente en un archivo de texto denominado "MDADisable.reg":

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework]
"MDA"="0"

A continuación, ejecute el archivo MDADisable.reg desde el símbolo del sistema.

De forma predeterminada, los MDA están habilitados al ejecutar la aplicación adjunta a un depurador, incluso sin agregar la clave del Registro. Ejemplos de estos asistentes son MDA de pInvokeStackImbalance e MDA de invalidApartmentStateChange. Puede deshabilitar estos asistentes ejecutando el archivo MDADisable.reg como se explicó anteriormente.

Habilitar y deshabilitar utilizado una variable de entorno

La activación de MDA también puede controlarse mediante la variable de entorno COMPLUS_MDA. La variable de entorno reemplaza la clave del Registro. La cadena es una lista de nombres de MDA delimitada por puntos y comas u otras cadenas de control especiales, y no distingue entre mayúsculas y minúsculas. Al iniciar bajo un depurador administrado o no administrado se habilita de forma predeterminada un conjunto de MDA. Esto se hace anteponiendo implícitamente la lista de MDA delimitada por puntos y comas habilitada de manera predeterminada bajo depuradores según el valor de la variable de entorno o de la clave del Registro. Las cadenas de control especiales son las siguientes:

  • 0 - Desactiva todos los MDA.

  • 1: lee la configuración de MDA de Nombre de aplicación.mda.config.

  • managedDebugger - Activa explícitamente todos los MDA que se activan implícitamente cuando se inicia un ejecutable administrado bajo un depurador.

  • unmanagedDebugger - Activa explícitamente todos los MDA que se activan implícitamente cuando se inicia un ejecutable no administrado bajo un depurador.

Si hay ajustes contradictorios, los más recientes reemplazan los ajustes anteriores:

  • COMPLUS_MDA=0 deshabilita todos los MDA que incluyen aquellos habilitados implícitamente bajo un depurador.

  • COMPLUS_MDA=gcUnmanagedToManaged habilita gcUnmanagedToManaged implícitamente además de cualquier otro habilitado implícitamente bajo un depurador.

  • COMPLUS_MDA =0;gcUnmanagedToManaged habilita gcUnmanagedToManaged pero deshabilita esos MDA que de lo contrario estarían habilitados implícitamente bajo un depurador.

Habilitar y deshabilitar utilizando ajustes de configuración específicos de la aplicación

Puede habilitar, deshabilitar y configurar individualmente algunos asistentes en el archivo de configuración de MDA para la aplicación. Para habilitar el uso de un archivo de configuración de la aplicación para configurar los MDA, es necesario establecer la clave del Registro MDA o la variable de entorno COMPLUS_MDA. El archivo de configuración de la aplicación se encuentra normalmente en el mismo directorio que el archivo ejecutable de la aplicación (.exe). El nombre del archivo toma la forma Nombre de aplicación.mda.config; por ejemplo, notepad.exe.mda.config. Los asistentes habilitados en el archivo de configuración de la aplicación pueden tener atributos o elementos específicamente diseñados para controlar el comportamiento de ese asistente. El ejemplo siguiente muestra cómo habilitar y configurar el MDA de marshaling.

<mdaConfig>
  <assistants>
    <marshaling>
      <methodFilter>
        <match name="*"/>
      </methodFilter>
      <fieldFilter>
        <match name="*"/>
      </fieldFilter>
    </marshaling>
  </assistants>
</mdaConfig>

Estos ajustes habilitan y configuran el MDA Marshaling, que emite información que describe el tipo administrado que se está convirtiendo en un tipo no administrado para todas las transiciones de administrado a no administrado que tienen lugar en la aplicación. El MDA Marshaling tiene mayor flexibilidad para filtrar los campos del nombre del método y la estructura proporcionados en los elementos secundarios <methodFilter> y <fieldFilter>, respectivamente.

Para obtener más información sobre la configuración específica de cada MDA concreto, consulte la documentación de ese MDA.

Resultados del MDA

El resultado del MDA es similar al ejemplo siguiente, que muestra el resultado del MDA pInvokeStackImbalance.

A call to PInvoke function 'MDATest!MDATest.Program::StdCall' 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.

Vea también

Otros recursos

Depurar y generar perfiles de aplicaciones

Historial de cambios

Fecha

Historial

Motivo

Julio de 2008

Se agregó una nota acerca de cómo evitar el mensaje de ContextSwitchDeadlock.

Comentarios de los clientes.