Diagnóstico de errores con ayudantes de depuraciones administradas
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 asistente 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.
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 Asistentes 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:
En el Explorador de soluciones, seleccione un proyecto.
En el menú Proyecto, haga clic en Propiedades.
Aparece la ventana Diseñador de proyectos.
Haga clic en la ficha Depurar.
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 Asistentes para la depuración administrada y, a continuación, active o desactive la casilla Producida del MDA individual.
Habilitar y deshabilitar MDA utilizando una clave del Registro
Puede habilitar MDA agregando la subclave HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\MDA (tipo REG_SZ, valor 1) al Registro de Windows. Copie el siguiente ejemplo en un archivo de texto denominado MDAEnable.reg y haga doble clic en el nombre de archivo en el Explorador de Windows para habilitar MDA en ese equipo.
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework]
"MDA"="1"
Para deshabilitar MDA, establezca la subclave MDA en 0 (cero) utilizando el Editor del Registro de Windows. También puede copiar el siguiente ejemplo en un archivo de texto denominado MDADisable.reg y hacer doble clic en el nombre de archivo en el Explorador de Windows.
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework]
"MDA"="0"
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. Ejemplos de estos asistentes son MDA de pInvokeStackImbalance e MDA de invalidApartmentStateChange. Puede deshabilitar estos asistentes ejecutando el archivo MDADisable.reg como se explica anteriormente en esta sección.
Habilitar y deshabilitar MDA utilizado una variable de entorno
La activación de MDA también puede controlarse mediante la variable de entorno COMPLUS_MDA, que reemplaza la clave del Registro. La cadena COMPLUS_MDA es una lista delimitada por puntos y comas de nombres de MDA 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 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 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, 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.
Habilitar y deshabilitar MDA utilizando valores 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 (.exe) de la aplicación. El nombre de archivo toma el formato nombreDeAplicación.mda.config; por ejemplo, notepad.exe.mda.config. Los asistentes que están habilitados en el archivo de configuración de la aplicación pueden tener atributos o elementos diseñados específicamente para controlar el comportamiento de los citados asistentes. 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>
El MDA de Marshaling emite información sobre el tipo administrado cuya referencia se calcula 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 siguiente ejemplo se muestra cómo habilitar varios MDA utilizando 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. |
Salida 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.