Diagnóstico de errores con asistentes de depuración administrados

Los asistentes de depuración administrados (MDA) son ayudas para la depuración que trabajan con Common Language Runtime (CLR) para proporcionar información sobre el 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 mediante la adición de una clave al Registro de Windows o el establecimiento de 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.

La tabla siguiente enumera los MDA incluidos con .NET Framework:

MDA
asynchronousThreadAbort
bindingFailure
callbackOnCollectedDelegate
contextSwitchDeadlock
dangerousThreadingAPI
dateTimeInvalidLocalFormat
dirtyCastAndCallOnInterface
disconnectedContext
dllMainReturnsFalse
exceptionSwallowedOnCallFromCom
failedQI
fatalExecutionEngineError
gcManagedToUnmanaged
gcUnmanagedToManaged
illegalPrepareConstrainedRegion
invalidApartmentStateChange
invalidCERCall
invalidFunctionPointerInDelegate
invalidGCHandleCookie
invalidIUnknown
invalidMemberDeclaration
invalidOverlappedToPinvoke
invalidVariant
jitCompilationStart
loaderLock
loadFromContext
marshalCleanupError
marshaling
memberInfoCacheCreation
moduloObjectHashcode
nonComVisibleBaseClass
notMarshalable
openGenericCERCall
overlappedFreeError
pInvokeLog
pInvokeStackImbalance
raceOnRCWCleanup
reentrancy
releaseHandleFailed
reportAvOnComRelease
streamWriterBufferedDataLost
virtualCERCall

De forma predeterminada, .NET Framework activa un subconjunto de MDA para todos los depuradores administrados. Para ver el conjunto predeterminado en Visual Studio, seleccione Ventanas>Configuración de excepciones en el menú Depurar y, a continuación, expanda la lista Asistentes de depuración administrados.

Exception Settings window in Visual Studio

Habilitar y deshabilitar los 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.

Sugerencia

En lugar de deshabilitar los MDA, puede impedir que Visual Studio muestre el cuadro de diálogo de MDA cada vez que se reciba una notificación de MDA. Para ello, seleccione Ventanas>Configuración de excepciones en el menú Depurar, expanda la lista Asistentes de depuración administrados y, después, active o desactive la casilla Interrumpir cuando se produzca del MDA individual.

Clave del Registro

Para habilitar los MDA, agregue la subclave HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\MDA (tipo REG_SZ, valor 1) al Registro de Windows. Copie el ejemplo siguiente en un archivo de texto llamado MDAEnable.reg. Abra el Editor del Registro de Windows (RegEdit.exe) y, desde el menú Archivo, elija Importar. Seleccione el archivo MDAEnable.reg para habilitar los MDA en ese equipo. Si se establece la subclave en un valor de cadena de 1 (no en un valor DWORD de 1), se habilita la lectura de la configuración de MDA desde el archivo NombreAplicación.sufijo.mda.config. Por ejemplo, el archivo de configuración de MDA para el Bloc de notas se llamaría notepad.exe.mda.config.

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework]
"MDA"="1"

Si el equipo ejecuta una aplicación de 32 bits en un sistema operativo de 64 bits, la clave de MDA debe establecerse de la forma siguiente:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework]
"MDA"="1"

Consulte Opciones de configuración específicas de la aplicación para obtener más información. La variable de entorno COMPLUS_MDA puede invalidar la configuración del Registro. Consulte Variable de entorno para obtener más información.

Para deshabilitar los MDA, establezca la subclave de MDA en 0 (cero) con el Editor del Registro de Windows.

De forma predeterminada, algunos MDA están habilitados cuando se ejecuta una aplicación asociada a un depurador, incluso sin agregar la clave del Registro. Puede deshabilitar estos asistentes ejecutando el archivo MDADisable.reg, como se ha explicado anteriormente en esta sección.

Variable de entorno

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

  • 0 - Desactiva todos los MDA.

  • 1: lee la configuración de MDA de NombreAplicació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, incluidos los habilitados implícitamente bajo un depurador.

  • COMPLUS_MDA=gcUnmanagedToManaged habilita gcUnmanagedToManaged además de los MDA habilitados implícitamente bajo un depurador.

  • COMPLUS_MDA=0;gcUnmanagedToManaged habilita gcUnmanagedToManaged pero deshabilita los MDA que, de otro modo, estarían habilitados implícitamente bajo un depurador.

Opciones de configuración específicas 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 de 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 (.exe) de la aplicación. El nombre del archivo toma el formato NombreAplicació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 diseñados para controlar el comportamiento del asistente.

El ejemplo siguiente muestra cómo habilitar y configurar la serialización:

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

El MDA de Marshaling emite información sobre el tipo administrado que se va a serializar a un tipo no administrado para cada transición de administrado a no administrado en la aplicación. El MDA de Marshaling también puede filtrar los nombres de los campos de método y estructura proporcionados en los elementos secundarios methodFilter y fieldFilter, respectivamente.

En el ejemplo siguiente, se muestra cómo habilitar varios MDA mediante su configuración predeterminada:

<mdaConfig>
  <assistants>
    <illegalPrepareConstrainedRegion />
    <invalidCERCall />
    <openGenericCERCall />
    <virtualCERCall />
  </assistants>
</mdaConfig>

Importante

Cuando se especifica más de un asistente en un archivo de configuración, se deben enumerar en orden alfabético. Por ejemplo, si se desea habilitar los MDA virtualCERCall e invalidCERCall, se debe agregar la entrada <invalidCERCall /> antes que la entrada <virtualCERCall />. Si las entradas no están en orden alfabético, se muestra un mensaje de excepción no controlada de archivo de configuración no válido.

Excepciones de MDA

Cuando se habilita un MDA, está activo aunque el código no se esté ejecutando en un depurador. Si se genera un evento MDA cuando un depurador no está presente, el mensaje del evento se presenta en un cuadro de diálogo de excepción no controlada, 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.

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 del MDA. Para ello, en el menú Depurar, seleccione Ventanas>Configuración de excepciones. En la ventana Configuración de excepciones, expanda la lista Asistentes de depuración administrados y, después, desactive la casilla Interrumpir cuando se produzca del MDA individual. También puede usar este cuadro de diálogo para habilitar la visualización de los cuadros de diálogo de excepciones de MDA.

Salida del MDA

La salida del MDA es similar al ejemplo siguiente, que muestra la salida del MDA PInvokeStackImbalance:

Una llamada a la función PInvoke "MDATest!MDATest.Program::StdCall" 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.

Consulte también