Compartir a través de


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

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.

Los asistentes de depuración administrados (MDA) son ayudas para la depuración que funcionan con el common language runtime (CLR) y proporcionan información sobre el estado del entorno de ejecución. Los asistentes generan mensajes informativos sobre eventos en tiempo de ejecución que de otra forma no pueden interceptar. Puede usar MDA para aislar errores de aplicación difíciles de encontrar que se producen al realizar la transición entre código administrado y no administrado.

Puede habilitar o deshabilitar todos los MDA agregando una clave al Registro de Windows o estableciendo una variable de entorno. Puede habilitar MDA específicas mediante las opciones de configuración de la aplicación. Puede establecer opciones de configuración adicionales para algunos MDA individuales en el archivo de configuración de la aplicación. Dado que estos archivos de configuración se analizan cuando se carga el 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.

En la tabla siguiente se enumeran los MDA que se incluyen con .NET Framework:

MDA
asincrónicoThreadAbort
bindingFailure
callbackOnCollectedDelegate
contextSwitchDeadlock
dangerousThreadingAPI
dateTimeInvalidLocalFormat
dirtyCastAndCallOnInterface
disconnectedContext
dllMainReturnsFalse
exceptionSwallowedOnCallFromCom
failedQI
errorFatalDelMotorDeEjecución
gcManagedToUnmanaged
gcUnmanagedToManaged
illegalPrepareConstrainedRegion
invalidApartmentStateChange
invalidCERCall
invalidFunctionPointerInDelegate
invalidGCHandleCookie
invalidIUnknown
declaraciónDeMiembroInválida
invalidOverlappedToPinvoke
invalidVariant
jitCompilationStart
loaderLock
loadFromContext
marshalCleanupError
Cálculo
creaciónDeCachéDeInformaciónDelMiembro
moduloObjectHashcode
nonComVisibleBaseClass
notMarshalable
openGenericCERCall
superpuestaFreeError
pInvokeLog
pInvokeStackImbalance
raceOnRCWCleanup
reentrada
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, elijaConfiguración de excepciones de > en el menú Depurar y, a continuación, expanda la lista Asistentes de depuración administrados.

Ventana Configuración de excepciones en Visual Studio

Habilitar y deshabilitar MDAs

Puede habilitar y deshabilitar mdA mediante una clave del Registro, una variable de entorno y opciones de configuración de la aplicación. Debe habilitar la clave del Registro o la variable de entorno para usar 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 MDA cada vez que se reciba una notificación de MDA. Para ello, elija Windows>Configuración de excepciones en el menú Depurar, expanda la lista Asistentes de depuración gestionada y, a continuación, seleccione o desmarque la casilla Interrumpir cuando se produce para la MDA individual.

Clave de registro

Para habilitar los MDA, agregue la subclave HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\MDA (tipo REG_SZ, valor 1) en el Registro de Windows. Copie el ejemplo siguiente en un archivo de texto denominado MDAEnable.reg. Abra el Editor del Registro de Windows (RegEdit.exe) y, en el menú Archivo , elija Importar. Seleccione el archivo MDAEnable.reg para habilitar mdAs en ese equipo. Si se establece la subclave en el valor de cadena de 1 (no el valor DWORD de 1), se habilita la lectura de la configuración de MDA desde el archivo ApplicationName.suffix.mda.config. Por ejemplo, el archivo de configuración de MDA para el Bloc de notas se denominarí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 MDA debe establecerse como la siguiente:

Windows Registry Editor Version 5.00

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

Consulte Application-Specific Opciones de configuración para obtener más información. La configuración del registro puede ser reemplazada por la variable de entorno COMPLUS_MDA. Consulte Variable de entorno para obtener más información.

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

De forma predeterminada, algunos MDA se habilitan cuando se ejecuta una aplicación que está vinculada a un depurador, incluso sin agregar la clave del registro. Puede deshabilitar estos asistentes ejecutando el archivo MDADisable.reg tal y como se ha descrito anteriormente en esta sección.

Variable de entorno

La activación de MDA también se puede controlar mediante la variable COMPLUS_MDAde entorno , que invalida la clave del Registro. La COMPLUS_MDA cadena es una lista sin distinción entre mayúsculas y minúsculas y delimitada por punto y coma 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 desde ApplicationName.mda.config.

  • managedDebugger - Activa explícitamente todas las MDAs que se activan de forma implícita al iniciar un ejecutable administrado bajo un depurador.

  • unmanagedDebugger : activa explícitamente todas las MDA que se activan implícitamente cuando se inicia un ejecutable no administrado en un depurador.

Si hay configuraciones en conflicto, la configuración más reciente invalida la configuración anterior:

  • 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 de Application-Specific

Puede habilitar, deshabilitar y configurar algunos asistentes individualmente en el archivo de configuración de MDA para la aplicación. Para habilitar el uso de un archivo de configuración de aplicación para configurar MDA, debe establecerse la clave del Registro de MDA o la COMPLUS_MDA variable de entorno. 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 de archivo toma el formato ApplicationName.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.

En el ejemplo siguiente se 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 Marshaling MDA 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

Al especificar más de un asistente en un archivo de configuración, debe enumerarlos en orden alfabético. Por ejemplo, si desea habilitar tanto el virtualCERCall como el invalidCERCall MDA, debe agregar la entrada <invalidCERCall /> antes de la entrada <virtualCERCall />. Si las entradas no están en orden alfabético, se muestra un mensaje de excepción de archivo de configuración no válido no controlado.

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 de evento se presenta en un cuadro de diálogo de excepción no controlada, aunque no es una excepción no controlada. Para evitar el cuadro de diálogo, quite la configuración de habilitación de 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 excepción que aparece para eventos MDA específicos. Para ello, en el menú Depurar, elijaConfiguración de excepciones de >. 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 cuadros de diálogo de excepción de MDA.

Salida del MDA

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

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

Consulte también