Controlar excepciones y eventos

Puede detectar y controlar excepciones en aplicaciones en modo de usuario y en modo kernel por diversos métodos. Un depurador activo, un depurador posterior o una rutina interna de control de errores son todas formas comunes de controlar las excepciones.

Para obtener más información sobre el orden de precedencia de estos distintos controladores de excepciones, consulte Habilitación de la depuración postmortem.

Cuando el sistema operativo Microsoft Windows permite a un depurador controlar una excepción, la aplicación que generó la excepción se divide en el depurador. Es decir, la aplicación se detiene y el depurador se activa. A continuación, el depurador puede controlar la excepción de alguna manera o analizar la situación. Después, el depurador puede finalizar el proceso o dejar que se reanude la ejecución.

Si el depurador omite la excepción y permite que la aplicación continúe ejecutándose, el sistema operativo busca otros controladores de excepciones como si no hubiera ningún depurador presente. Si se controla la excepción, la aplicación continúa ejecutándose. Sin embargo, si la excepción sigue sin controlarse, el depurador se da una segunda oportunidad para tratar la situación.

Uso del depurador para analizar una excepción

Cuando una excepción o evento se interrumpe en el depurador, puede usar el depurador para examinar el código que se ejecuta y la memoria que la aplicación está usando. Al modificar determinadas cantidades o saltar a un punto diferente de la aplicación, es posible que pueda quitar la causa de la excepción.

Para reanudar la ejecución, emita un comando gh (Go con control de excepciones) o gn (Go con excepción no controlada).

Si emite el comando gn en la segunda oportunidad del depurador para controlar la excepción, la aplicación finaliza.

Excepciones en modo kernel

Las excepciones que se producen en el código en modo kernel son más graves que las excepciones en modo de usuario. Si no se controlan excepciones en modo kernel, se emite una comprobación de errores y el sistema se detiene.

Al igual que con las excepciones en modo de usuario, si un depurador en modo kernel está asociado al sistema, se notifica al depurador antes de que aparezca la pantalla de comprobación de errores (también conocida como pantalla azul). Si no hay ningún depurador adjunto, aparecerá la pantalla de comprobación de errores. En este caso, el sistema operativo podría crear un archivo de volcado de memoria.

Controlar excepciones y eventos desde el depurador

Puede configurar el depurador para reaccionar a las excepciones y eventos especificados de una manera específica.

El depurador puede establecer el estado de interrupción para cada excepción o evento:

  • El evento puede provocar una interrupción en el depurador tan pronto como se produzca (la "primera oportunidad").

  • El evento puede interrumpirse después de que otros controladores de errores hayan sido dados la oportunidad de responder (la "segunda oportunidad").

  • El evento también puede enviar al depurador un mensaje pero continuar ejecutándose.

  • El depurador puede omitir el evento.

El depurador también puede establecer el estado de control de cada excepción y evento. El depurador puede tratar el evento como una excepción controlada o una excepción no controlada. (Por supuesto, los eventos que no son realmente errores no requieren ningún control).

Para controlar el estado de interrupción y el estado de control, realice una de las siguientes acciones:

  • Use el comando SXE, SXD, SXN o SXI en la ventana Comando del depurador.

  • (CDB y NTSD) Use la opción -x, -xe, -xd, -xn o -xi en la línea de comandos.

  • (CDB, NTSD y KD) Use la palabra clave sxe o sxd en el archivo Tools.ini .

  • (Solo WinDbg) Seleccione Filtros de eventos en el menú Depurar para abrir el cuadro de diálogo Filtros de eventos y, a continuación, elija las opciones que desee.

El comando SX\*, la opción de línea de comandos -x\* y la palabra clave sx\* Tools.ini normalmente establecen el estado de interrupción del evento especificado. Puede agregar la opción -h para que el estado de control se establezca en su lugar.

Hay cuatro códigos de evento especiales (cc, hc, bpec y ssec) que siempre especifican el estado de control en lugar del estado de interrupción.

Puede mostrar la excepción o evento más reciente mediante el comando .lastevent (Mostrar último evento).

Controlar el estado de interrupción

Al establecer el estado de interrupción de una excepción o evento, puede usar las siguientes opciones.

Get-Help Nombre de estado Descripción

SXE o -xe

Break

(Habilitado)

Cuando se produce esta excepción, el destino se divide inmediatamente en el depurador. Esta interrupción se produce antes de que se activen otros controladores de errores. Este método se denomina control de primera oportunidad.

SXD o -xd

Segunda oportunidad de interrupción

(Deshabilitado)

El depurador no se interrumpe para este tipo de excepción de primera oportunidad (aunque se muestra un mensaje). Si otros controladores de errores no pueden solucionar esta excepción, la ejecución se detiene y el destino se divide en el depurador. Este método se denomina control de segunda oportunidad.

SXN o -xn

Salida

(Notificar)

Cuando se produce esta excepción, la aplicación de destino no se divide en el depurador en absoluto. Sin embargo, se muestra un mensaje que informa al usuario de esta excepción.

SXI o -xi

Omitir

Cuando se produce esta excepción, la aplicación de destino no se divide en el depurador y no se muestra ningún mensaje.

Si una configuración de SX* no prevé una excepción, la aplicación de destino se divide en el depurador en la segunda oportunidad. El estado predeterminado de los eventos aparece en la siguiente sección "Definiciones de eventos y valores predeterminados" de este tema.

Para establecer el estado de interrupción mediante la interfaz gráfica de WinDbg, filtros de eventos en el menú Depurar seleccione el evento que desee de la lista en el cuadro de diálogo Filtros de eventos y, a continuación, seleccione Habilitado, Deshabilitado, Salida o Omitir.

Control del estado de control

Todos los eventos se consideran no controlados, a menos que use el comando gh (Go con control de excepciones).

Todas las excepciones se consideran no controladas, a menos que use el comando sx\* junto con la opción -h .

Además, las opciones de SX* pueden configurar el estado de control de identificadores no válidos, STATUS_BREAKPOINT instrucciones de interrupción y excepciones de un solo paso. (Esta configuración es independiente de su configuración de interrupción). Al configurar su estado de interrupción, estos eventos se denominan ch, bpe y sse, respectivamente. Al configurar su estado de control, estos eventos se denominan hc, bpec y ssec, respectivamente. (Para obtener la lista completa de eventos, consulte la sección "Definiciones de eventos y valores predeterminados".

Puede configurar el estado de control para el evento CTRL+C (cc), pero no su estado de interrupción. Si una aplicación recibe un evento CTRL+C, la aplicación siempre se divide en el depurador.

Cuando se usa el comando SX* en eventos cc, hc, bpec y ssec , o cuando se usa el comando SX* junto con la opción -h en una excepción, se producen las siguientes acciones.

Get-Help Nombre de estado Descripción

SXE

Manejado

El evento se considera controlado cuando se reanuda la ejecución.

SXD,SXN,SXI

No controlado

El evento se considera no controlado cuando se reanuda la ejecución.

Para establecer el estado de control mediante la interfaz gráfica de WinDbg, seleccione Filtros de eventos en el menú Depurar , seleccione el evento que desee de la lista en el cuadro de diálogo Filtros de eventos y, a continuación, seleccione Controlado o No controlado.

Comandos automáticos

El depurador también permite establecer comandos que se ejecutan automáticamente si el evento o excepción provoca una interrupción en el depurador. Puede establecer una cadena de comando para la interrupción de primera oportunidad y una cadena de comandos para la interrupción de segunda oportunidad. Puede establecer estas cadenas con el comando SX\* o la depuración | Comando Filtros de eventos. Cada cadena de comando puede contener varios comandos separados con punto y coma.

Estos comandos se ejecutan independientemente del estado de interrupción. Es decir, si el estado de interrupción es "Omitir", el comando todavía se ejecuta. Si el estado de interrupción es "Interrupción de segunda oportunidad", el comando de primera oportunidad se ejecuta cuando se produce la excepción por primera vez, antes de que se impliquen otros controladores de excepciones. La cadena de comandos puede terminar con un comando de ejecución como g (Go),gh (Go con controlador de excepciones) o gn (Go con excepción no controlada) .

Definiciones de eventos y valores predeterminados

Puede cambiar el estado de interrupción o controlar el estado de las siguientes excepciones. Se indica su estado de interrupción predeterminado.

El estado de control predeterminado de las siguientes excepciones siempre es "No controlado". Tenga cuidado de cambiar este estado. Si cambia este estado a "Controlado", todas las excepciones de primera oportunidad y segunda oportunidad de este tipo se consideran controladas y esta configuración omite todas las rutinas de control de excepciones.

Código de evento Significado Estado de interrupción predeterminado

asrt

Error de aserción

Break

av

Infracción de acceso

Break

Dm

Datos desalineados

Break

Dz

División de enteros por cero

Break

c000008e

División de punto flotante por cero

Break

eh

Excepción eh de C++

Segunda oportunidad de interrupción

Gp

Infracción de página de Protección

Break

Ii

Instrucción no válida

Segunda oportunidad de interrupción

Iov

Desbordamiento entero

Break

Ip

Error de E/S en la página

Break

Isc

Llamada del sistema no válida

Break

lsq

Secuencia de bloqueo no válida

Break

Sbo

Desbordamiento de búfer de pila

Break

Sov

Stack Overflow

Break

wkd

Depurador de reactivación

Break

Aph

Bloqueo de la aplicación

Esta excepción se desencadena si el sistema operativo Windows concluye que un proceso ha dejado de responder (es decir, está bloqueado).

Break

3c

Terminación de la aplicación secundaria

Segunda oportunidad de interrupción

chhc

Manipulador no válido

Break

Number

Cualquier excepción numerada

Segunda oportunidad de interrupción

Nota Puede invalidar el estado de interrupción de asrt para una dirección específica mediante el comando ah (Control de aserciones). Los códigos de evento ch y hc hacen referencia a la misma excepción. Cuando controle su estado de interrupción, use sx* ch. Cuando controle su estado de control, use sx* hc.

Puede cambiar el estado de interrupción o controlar el estado de las siguientes excepciones. Se indica su estado de interrupción predeterminado.

El estado de control predeterminado de las siguientes excepciones siempre es "Controlado". Dado que estas excepciones se usan para comunicarse con el depurador, normalmente no debe cambiar su estado a "No controlado". Este estado hace que otros controladores de excepciones detecten las excepciones si el depurador las omite.

Una aplicación puede usar DBG_COMMAND_EXCEPTION (dbce) para comunicarse con el depurador. Esta excepción es similar a un punto de interrupción, pero puede usar el comando SX* para reaccionar de una manera específica cuando se produce esta excepción.

Código de evento Significado Estado de interrupción predeterminado

dbce

Excepción de comando del depurador especial

Ignorar

vcpp

Excepción especial de Visual C++

Ignorar

Wos

Excepción de paso único de WOW64

Break

Wob

Excepción de punto de interrupción WOW64:

Break

Sse
ssec

Excepción de un solo paso

Break

Bpe
bpec

Excepción de punto de interrupción

Break

Cce
Cc

CTRL+C o CTRL+BREAK

Esta excepción se desencadena si el destino es una aplicación de consola y se le pasa CTRL+C o CTRL+BREAK.

Break

Nota Las tres excepciones finales de la tabla anterior tienen dos códigos de evento diferentes. Cuando controle su estado de interrupción, use sse, bpe y cce. Cuando controle su estado de control, use ssec, bpec y cc.

Las siguientes excepciones son útiles al depurar código administrado.

Código de evento Significado Estado predeterminado

clr

Excepción de Common Language Runtime

Segunda oportunidad de interrupción

No controlado

clrn

Excepción de notificación de Common Language Runtime

Segunda oportunidad de interrupción

Controlado

Puede cambiar el estado de interrupción de los siguientes eventos. Dado que estos eventos no son excepciones, su estado de control es irrelevante.

Código de evento Significado Estado de interrupción predeterminado

ser

Error de sistema

Ignorar

cpr[:Process]

Creación de procesos

Establecer el estado de interrupción de este evento solo se aplica a la depuración en modo de usuario. Este evento no se produce en modo kernel.

Puede controlar este evento solo si ha activado la depuración de procesos secundarios en CDB o WinDbg, ya sea a través de laopción de línea de comandos -o o mediante el comando .childdbg (Depurar procesos secundarios).

El nombre del proceso puede incluir una extensión de nombre de archivo opcional y un asterisco () o signo de interrogación (?) como caracteres comodín. El depurador solo recuerda la configuración de cpr más reciente. No se admite la configuración independiente para procesos independientes. Incluya dos puntos o un espacio entre cpr y Process.

Si se omite Process, la configuración se aplica a cualquier creación de procesos secundarios.

Ignorar

epr[:Process]

Salida del proceso

Establecer el estado de interrupción de este evento solo se aplica a la depuración en modo de usuario. Este evento no se produce en modo kernel.

Puede controlar este evento solo si ha activado la depuración de procesos secundarios en CDB o WinDbg, ya sea a través de laopción de línea de comandos -o o mediante el comando .childdbg (Depurar procesos secundarios).

El nombre del proceso puede incluir una extensión de nombre de archivo opcional y un asterisco () o signo de interrogación (?) como caracteres comodín. El depurador solo recuerda la configuración epr más reciente. No se admite la configuración independiente para procesos independientes. Incluya dos puntos o un espacio entre epr y Process.

Si se omite Process, la configuración se aplica a cualquier salida de proceso secundario.

Ignorar

ct

Creación de subprocesos

Ignorar

et

Salida del subproceso

Ignorar

ld[:Module]

Carga del módulo

Si especifica Module, la interrupción se produce cuando se carga el módulo con este nombre. El módulo puede especificar el nombre o la dirección del módulo. Si se usa el nombre, Module puede contener una variedad de caracteres comodín y especificadores. (Para obtener más información sobre la sintaxis, vea Sintaxis de caracteres comodín de cadena).

El depurador recuerda solo la configuración ld más reciente. No se admite la configuración independiente para módulos independientes. Incluya dos puntos o un espacio entre ld y Module.

Si se omite Module , el evento se desencadena cuando se carga cualquier módulo.

Resultados

ud[:Module]

Descarga del módulo

Si especifica Module, la interrupción se produce cuando se descarga el módulo con este nombre o en esta dirección base. El módulo puede especificar el nombre o la dirección del módulo. Si se usa el nombre, Module puede ser un nombre exacto o incluir caracteres comodín. Si Module es un nombre exacto, se resuelve inmediatamente en una dirección base mediante la lista de módulos del depurador actual y se almacena como una dirección. Si Module contiene caracteres comodín, la cadena de patrón se mantiene para buscar coincidencias posteriores cuando se producen eventos de descarga.

Rara vez, el depurador no tiene información de nombre para los eventos de descarga y solo coincide con la dirección base. Por lo tanto, si Module contiene caracteres comodín, el depurador no puede realizar una coincidencia de nombre en este caso de descarga concreto y se interrumpe cuando se descarga cualquier módulo.

El depurador solo recuerda la configuración ud más reciente. No se admite la configuración independiente para módulos independientes. Incluya dos puntos o un espacio entre ud y Module.

Si se omite Module , el evento se desencadena cuando se carga cualquier módulo.

Resultados

out[:Output]

Salida de la aplicación de destino

Si especifica Salida, la interrupción solo se produce cuando se recibe la salida que coincide con el patrón especificado. La salida puede contener una variedad de caracteres comodín y especificadores. (Para obtener más información sobre la sintaxis, vea Sintaxis de caracteres comodín de cadena). Sin embargo, Output no puede contener dos puntos o espacios. La coincidencia no distingue entre mayúsculas y minúsculas. Incluya dos puntos o un espacio entre out y Output.

Ignorar

Ibp

Punto de interrupción inicial

(Este evento se produce al principio de la sesión de depuración y después de reiniciar el equipo de destino).

En modo de usuario: Romper. Puede cambiar este estado a "Omitir" mediante la opción de línea de comandos-g.

En modo kernel: Ignorar. Puede cambiar este estado a "Habilitado" por diversos métodos. Para obtener más información sobre cómo cambiar este estado, vea Bloqueo y reinicio del equipo de destino.

Iml

Carga inicial del módulo

(solo modo kernel)

omitir Puede cambiar este estado a "Interrumpir" por diversos métodos. Para obtener más información sobre cómo cambiar este estado, vea Bloqueo y reinicio del equipo de destino.