Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Actualización: noviembre 2007
En este tema se proporciona una introducción a la funcionalidad que proporcionan los servicios de depuración de Common Language Runtime (CLR). Incluye las subsecciones siguientes:
Asociar o iniciar un programa
Controlar la ejecución
Examinar el estado de un programa
Modificar el estado de un programa
Utilizar Editar y continuar
Evaluar funciones
Insertar código dinámicamente
Asociar o iniciar un programa
CLR permite asociar el depurador a un programa en ejecución o iniciar un proceso. Los servicios de depuración de CLR son compatibles con la depuración Just-In-Time (JIT) permitiendo asociar el depurador a un programa que inicia una excepción no controlada. Sin embargo, un programa que no está ejecutándose en modo depurable puede tener menos información de depuración disponible. Un programa siempre se puede ejecutar en modo depurable para evitar este problema. Para obtener más información sobre el modo depurable, vea lo siguiente:
Controlar la ejecución
Los servicios de depuración de CLR proporcionan varias maneras de controlar la ejecución de un programa. Entre ellas están los puntos de interrupción, el recorrido paso a paso, notificación de excepciones, la evaluación de la función y otros eventos relacionados con el inicio y el cierre de un programa.
La API de depuración de CLR solamente proporciona control de ejecución para código administrado. Si desea realizar el control de ejecución en código no administrado, debe implementar esa funcionalidad de forma independiente en el depurador.
Puntos de interrupción
Puede crear puntos de interrupción especificando el código y el lenguaje intermedio de Microsoft (MSIL) o el desplazamiento nativo de la ubicación donde debe producirse el salto. A continuación, se notificará al depurador cuando se encuentre el punto de interrupción. La API de depuración no admite directamente puntos de interrupción condicionales; un depurador puede implementarlos evaluando una expresión en respuesta a un punto de interrupción y decidiendo si informar al usuario de la pausa.
Recorrido paso a paso
Los servicios de depuración de CLR proporcionan una gran variedad de funciones de recorrido paso a paso. Un programa puede recorrer el código de instrucción en instrucción (paso a paso) o por grupos de instrucciones (por intervalos). Puede omitir, entrar o salir de una función. Los servicios de depuración de CLR también pueden notificar al depurador si se produce una excepción que interrumpe el recorrido.
Aunque los servicios de depuración no son compatibles directamente con el recorrido por código no administrado, proporcionarán devoluciones de llamada cuando una operación de recorrido alcance código no administrado, para ceder el control al depurador. También proporcionan funcionalidad que permite el depurador determinar cuándo se está a punto de entrar en código administrado desde código no administrado.
El CLR no ofrece directamente el recorrido por el nivel de origen. Un depurador puede proporcionar esta funcionalidad utilizando el recorrido por intervalos con su propia información de asignación de origen. Puede utilizar las interfaces del almacén de símbolos para obtener información de nivel de origen. Para obtener más información sobre estas interfaces, vea Almacén de símbolos de diagnósticos (Referencia de la API no administrada).
Excepciones
Los servicios de depuración de CLR permiten informar un depurador de excepciones de primera y segunda oportunidad en código administrado. El objeto iniciado está disponible para la inspección en cada punto.
El CLR no administra excepciones nativas en código no administrado a menos que se propaguen hasta el código administrado. Sin embargo, todavía puede utilizar los servicios de depuración de Win32 que se comparten con los servicios de depuración de CLR para administrar excepciones no administradas.
Eventos de programa
Los servicios de depuración de CLR notifican a un depurador cuando se producen muchos eventos de programa. Estos eventos incluyen la creación y salida del proceso, creación y salida del subproceso, creación y salida del dominio de aplicación, carga y descarga del ensamblado, carga y descarga del módulo, carga y descarga de la clase. Para obtener un buen rendimiento, puede deshabilitar los eventos de carga y descarga de clase para un módulo. De forma predeterminada, los eventos de carga y descarga de clase están deshabilitados.
Control de subprocesos
Los servicios de depuración de CLR proporcionan interfaces para suspender y reanudar subprocesos individuales (administrados).
Examinar el estado de un programa
Los servicios de depuración de CLR proporcionan una manera detallada de inspeccionar las partes de un proceso que están ejecutando código administrado cuando el proceso está en un estado detenido. Un proceso se puede inspeccionar para obtener una lista de subprocesos físicos.
Un subproceso se puede examinar para inspeccionar su pila de llamadas. La pila de llamadas de un subproceso se descompone en dos niveles: el nivel de la cadena y el nivel del marco de pila. La pila de llamadas se descompone primero en cadenas. Una cadena es un segmento lógico contiguo de la pila de llamadas que contiene marcos de pila completamente administrados o no administrados. Además, todos los marcos llamados administrados de una única cadena comparten el mismo contexto de CLR. Una cadena puede ser administrada o no administrada.
Cada cadena administrada se puede descomponer además en marcos de pila únicos. Cada marco de pila representa una invocación de método. Puede consultar un marco de pila para obtener el código que está ejecutando u obtener sus argumentos, variables locales y registros nativos.
Una cadena no administrada no contiene marcos de pila. En su lugar, proporciona el intervalo de direcciones de pila que se asignan al código no administrado. Depende de un depurador de código no administrado descodificar la parte no administrada de la pila y proporcionar un seguimiento de la pila.
Nota
Los servicios de depuración de CLR no admiten el concepto de variables locales cuando existen en el código fuente. Depende del depurador asignar las variables locales a sus asignaciones.
Los servicios de depuración de CLR también proporcionan acceso a variables globales, estáticas de clase y variables locales de subproceso.
Modificar el estado de un programa
Los servicios de depuración de CLR permiten a un depurador cambiar la ubicación física del puntero de instrucción durante la ejecución, aunque ésta puede ser una operación peligrosa. El puntero de instrucción se puede cambiar correctamente cuando son ciertas las condiciones siguientes:
El puntero de instrucción actual y el puntero de la instrucción de destino están ambos en puntos de secuencia. Los puntos de secuencia representan aproximadamente los límites de instrucción.
El puntero de instrucción objeto no se encuentra en un filtro de excepciones, un bloque catch o un bloque finally.
Si dentro de un bloque catch, el puntero de instrucción de destino no se encuentra fuera del bloque catch.
El puntero de la instrucción de destino está en el mismo marco que el puntero de instrucción actual.
Cuando la ubicación física del puntero de instrucción cambie, las variables de la ubicación del puntero de instrucción actual se asignarán a las variables de la ubicación del puntero de la instrucción de destino. Las referencias de la recolección de elementos no utilizados a la ubicación del puntero de instrucción se inicializarán correctamente.
Una vez cambiado el puntero de instrucción, los servicios de depuración de CLR marcan la información de pila que haya en caché como no válida, y actualizan la información la próxima vez que se necesita. Los depuradores que almacenan en memoria caché punteros para información de pila tales como marcos y cadenas deben actualizar esta información después de cambiar el puntero de instrucción.
El depurador también puede modificar los datos de un programa cuando se detiene el programa. El depurador puede cambiar las variables locales y los argumentos de una función mientras la función se está ejecutando, de una manera similar a la inspección. El depurador también puede actualizar campos de matrices y objetos, así como campos estáticos y variables globales.
Utilizar Editar y continuar
Editar y continuar es una función que permite estar en el medio de una sesión de depuración, editar el código fuente, recompilar la fuente modificada y continuar la sesión de depuración sin tener que volver a ejecutar la aplicación ejecutable desde el principio. Desde una perspectiva funcional, Editar y continuar proporciona la capacidad de modificar el código que se está ejecutando en el depurador conservando el resto del estado en tiempo de ejecución de la aplicación ejecutable que se depura.
Evaluar funciones
Para evaluar expresiones de usuario y propiedades dinámicas de objetos, un depurador necesita un medio de ejecutar el código del proceso que se está depurando. Los servicios de depuración de CLR permiten al depurador realizar una llamada de función o método y hacer que se ejecute dentro del proceso del código que se está depurando.
El CLR permite al depurador anular este tipo de operación porque puede ser peligrosa (por ejemplo, puede desencadenar un interbloqueo con código existente). Si se anula la evaluación correctamente, el subproceso se trata como si la evaluación nunca se hubiera producido, excepto por los efectos secundarios en las variables locales de la evaluación parcial. Si la función llama a código no administrado o se bloquea de alguna manera, puede ser imposible de finalizar la evaluación.
Cuando la evaluación de la función ha finalizado, el CLR utiliza una devolución de llamada para notificar al depurador si la evaluación se completó normalmente o si la función produjo una excepción. Puede utilizar los métodos ICorDebugValue y ICorDebugValue2 para inspeccionar los resultados de una evaluación.
El subproceso en el que se va a producir la evaluación de la función se debe detener en código administrado, en un punto que sea seguro para la recolección de elementos no utilizados. (La evaluación de la función también se permite para las excepciones no controladas.) En código no optimizado, estos puntos seguros son muy comunes; la mayoría de las operaciones de recorrido de nivel de MSIL se completarán en uno de ellos. Sin embargo, estos puntos pueden ser raros en el código optimizado. A veces, puede que una función completa no tenga ningún punto seguro. La frecuencia de los puntos seguros para la recolección de elementos no utilizados variará de función a función. Incluso en código no optimizado, es posible no detenerse en uno de ellos. En código optimizado o no optimizado, el método ICorDebugController::Stop raramente aterriza en un punto seguro.
Los servicios de depuración de CLR prepararán una nueva cadena en el subproceso para iniciar una evaluación de función y llamar a la función solicitada. En cuanto se inicie la evaluación, todos los aspectos de la API de depuración están disponibles: control de ejecución, inspección, evaluación de la función, etc. Se admiten las evaluaciones anidadas y los puntos de interrupción se tratan de la manera habitual.
Insertar código dinámicamente
Algunos depuradores permiten a un usuario escribir instrucciones arbitrarias en la ventana Inmediato y ejecutar las instrucciones. Los servicios de depuración de CLR admiten este escenario. Dentro de lo razonable, no hay ninguna restricción sobre el código que puede insertar dinámicamente. (Por ejemplo, no se permiten las instrucciones goto no locales.)
La inyección dinámica de código se implementa utilizando una combinación de operaciones de Editar y continuar y evaluación de la función. El código que se va a insertar se contiene en una función y se inserta inserta utilizando Editar y continuar. A continuación, se evalúa la función insertada. Si lo desea, puede proporcionar a la función contenedora argumentos que se declaran para que sean ByRef, de modo que los efectos secundarios sean inmediatos y permanentes.