Controlar un programa durante la depuración
Durante la depuración, el control de un programa consta del establecimiento de puntos de interrupción en el código administrado, el recorrido paso a paso por el código administrado y no administrado, y la administración de excepciones de primera y segunda. Las secciones siguientes describen cómo un utiliza un depurador la API de depuración de Common Language Runtime (CLR) para realizar estas tareas.
Establecer un punto de interrupción en código administrado
La lista siguiente proporciona una descripción paso a paso de cómo establecer un punto de interrupción en código administrado:
El depurador obtiene un objeto de módulo para la función determinada. El depurador llama al método ICorDebugAppDomain::GetModuleFromMetaDataInterface con la interfaz de metadatos para obtener un objeto ICorDebugModule para el módulo de la función.
El depurador obtiene un objeto de función para la función determinada llamando al método ICorDebugModule::GetFunctionFromToken.
El depurador obtiene el objeto de código para la función determinada llamando al método ICorDebugFunction::GetILCode.
El depurador crea un punto de interrupción en el código administrado llamando al método ICorDebugCode::CreateBreakpoint con un desplazamiento concreto. CreateBreakpoint devuelve una instancia de ICorDebugBreakpoint. El punto de interrupción se crea en el estado activo.
El depurador continúa la ejecución del proceso llamando al método ICorDebugController::Continue en el proceso de depuración actual.
La API de depuración notifica al depurador cuando un subproceso alcanza el punto de interrupción llamando a la devolución de llamada ICorDebugManagedCallback::Breakpoint.
Recorrido paso a paso por el código administrado y no administrado
La lista siguiente proporciona una descripción paso a paso de cómo un depurador recorre paso a paso el código administrado.
El depurador crea un stepper, dado el subproceso en el que el se va producir el paso a paso. El depurador llama al método ICorDebugThread::CreateStepper para el subproceso que se está recorriendo. Como alternativa, el depurador puede llamar al método ICorDebugFrame::CreateStepper para el cuadro relativo al cual se va a realizar el recorrido. Se supone que el proceso se detiene cuando se crea el stepper.
El depurador recorre el subproceso llamando al método ICorDebugStepper::Step.
El depurador continúa la ejecución del proceso llamando al método ICorDebugController::Continue en el proceso de depuración actual.
La API de depuración informa al depurador que el paso se ha completado. La API de depuración llama al método ICorDebugManagedCallback::StepComplete para el objeto que el depurador había registrado con el motor en tiempo de ejecución.
El depurador recorre de nuevo el subproceso llamando al método ICorDebugStepper::Step.
El depurador continúa la ejecución del proceso llamando al método ICorDebugController::Continue en el proceso de depuración actual.
La lista siguiente describe alternativas de recorrido paso a paso con código no administrado:
El depurador omite opcionalmente el recorrido paso a paso en código nativo. El depurador llama al método ICorDebugStepper::StepOut para omitir el recorrido paso a paso por el código nativo hasta que se reactive el cuadro anterior. La API de depuración llama al método ICorDebugManagedCallback::StepComplete cuando se entra de nuevo en el código administrado.
El depurador recorre opcionalmente la siguiente sección de código administrado. El depurador llama al método ICorDebugStepper::Step para que se devuelva el control al depurador cuando se vuelva a entrar en el cuadro de código administrado anterior o cuando el código no administrado llame al nuevo código administrado.
El depurador continúa la ejecución del proceso llamando al método ICorDebugController::Continue en el proceso de depuración actual.
La API de depuración informa al depurador que está recorriendo código no administrado llamando al método ICorDebugUnmanagedCallback::DebugEvent.
Controlar las excepciones
La lista siguiente proporciona una descripción paso a paso de cómo se administran las excepciones de primera y segunda oportunidad:
CLR informa el depurador de que se ha producido una excepción de primera oportunidad. La API de depuración llama al método ICorDebugManagedCallback::Exception en la interfaz de ICorDebugManagedCallback que el depurador registró con el motor en tiempo de ejecución.
El depurador obtiene información sobre la excepción. El depurador llama al método ICorDebugThread::GetCurrentException en el objeto ICorDebugThread que se pasó en la devolución de llamada para obtener un objeto de excepción (ICorDebugValue).
El depurador obtiene el objeto ICorDebugObjectValue para la excepción. El depurador llama al método QueryInterface para obtener el objeto ICorDebugObjectValue para la excepción.
El depurador obtiene la clase del objeto de excepción que se inició llamando al método ICorDebugObjectValue::GetClass.
El depurador decide omitir la excepción y simplemente continúa.
CLR informa el depurador de que se ha producido una excepción de segunda oportunidad. La API de depuración llama al método ICorDebugManagedCallback::Exception y especifica que la excepción es una excepción de segunda oportunidad.
El usuario decide que la excepción es inconsecuente. El depurador llama al método ICorDebugThread::ClearCurrentException para el subproceso del código que se está depurando. Este método borra la excepción y evita que se inicie la excepción.
El depurador continúa la ejecución del proceso llamando al método ICorDebugController::Continue en el proceso de depuración actual.
Vea también
Conceptos
Información general sobre la depuración en CLR