Examinar un programa durante la depuración
Para examinar un programa durante la depuración, el depurador debe poder tener acceso a los marcos de pila administrados y evaluar expresiones. Las secciones siguientes describen cómo un utiliza un depurador la API de depuración de Common Language Runtime (CLR) para realizar estas tareas.
Acceso a pilas de llamadas
La lista siguiente proporciona una descripción paso a paso de cómo un depurador tiene acceso a los marcos de pila administrados. El proceso del código que está siendo depurado se debe detener para el acceso a los marcos de pila.
El depurador obtiene un enumerador para las cadenas de pila. El depurador llama al método ICorDebugThread::EnumerateChains para que el subproceso a cuyas cadenas de pila se va a tener acceso obtenga un objeto ICorDebugChainEnum para enumerar las cadenas de pila.
El depurador recorre en iteración las cadenas de pila llamando al método ICorDebugChainEnum::Next.
El depurador obtiene un enumerador para los marcos de pila de la cadena llamando al método ICorDebugChain::EnumerateFrames.
El depurador continúa recorriendo en iteración los marcos de pila llamando al método ICorDebugFrameEnum::Next.
El depurador obtiene opcionalmente la dirección IP. El depurador llama al método ICorDebugILFrame::GetIP para obtener la dirección IP relativa al inicio de la función para el marco de pila.
El depurador obtiene opcionalmente más información sobre el marco de pila. Por ejemplo, el depurador puede llamar al método ICorDebugFrame::GetFunctionToken para obtener el símbolo (token) de metadatos para la función correspondiente al código que está ejecutando el marco de pila. El depurador también puede llamar al método ICorDebugCode::GetCode para obtener un objeto que representa el código que está ejecutando el marco de pila.
Evaluar expresiones
Las expresiones en código nativo no administrado se pueden evaluar utilizando los mismos mecanismos que utilizan los depuradores convencionales.
En código administrado, el depurador puede evaluar una expresión como sigue:
Analizar la expresión.
Llamar a la API de depuración para tener acceso a los valores de las variables de la expresión e invocar las funciones de la expresión.
El depurador también puede hacer lo siguiente:
Envolver la expresión en una función global y compilar la función.
Llamar a la API de depuración (Editar y continuar) para agregar la función global.
Llamar a la API de depuración para evaluar la función.
La lista siguiente proporciona una descripción paso a paso de cómo un depurador evalúa una expresión. En este escenario, la expresión es A + MyFunc() donde se asume que A está en un registro y el código que se está depurando es código nativo administrado.
El depurador obtiene el valor de A. El depurador llama al método ICorDebugNativeFrame::GetLocalRegisterValue para el marco de pila en el que se va a evaluar la expresión.
El depurador crea un objeto de evaluación llamando al método ICorDebugThread::CreateEval para el subproceso en el que se va a evaluar la expresión.
El depurador calcula el valor de MyFunc() llamando al método ICorDebugEval::CallFunction.
El depurador evalúa la expresión. El depurador aplica plegamiento constante a la expresión utilizando los valores obtenidos en los dos pasos anteriores.
Vea también
Conceptos
Información general sobre la depuración en CLR