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.
Puede detectar y controlar excepciones en aplicaciones en modo de usuario y en modo kernel mediante diversos métodos. Un depurador activo, un depurador posterior o una rutina interna de control de errores son todas formas comunes de controlar 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 que un depurador controle 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. Después, el depurador puede gestionar la excepción de alguna manera o analizar la situación. Después, el depurador puede finalizar el proceso o permitir que este se reanude.
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, al depurador se le 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 usa la aplicación. 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.
Puede reanudar la ejecución mediante la emisión de un comando gh (Go with Exception Handled) o gn (Go with Exception Not Handled).
Si emite el comando gn en la segunda oportunidad del depurador para controlar la excepción, finaliza la aplicación.
Excepciones de Kernel-Mode
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 las excepciones en modo kernel, se emite una comprobación de errores y el sistema se detiene.
Al igual que sucede 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 se adjunta ningún depurador, aparecerá la pantalla de comprobación de errores. En este caso, el sistema operativo podría crear un crash dump.
Controlar excepciones y eventos desde el depurador
Puede configurar el depurador para reaccionar a 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 ruptura en el depurador en cuanto se produzca (la "primera oportunidad").
El evento puede interrumpirse después de que otros controladores de errores se hayan dado 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 manejo 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 pausa y el manejo del estado, 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.
| Command | Nombre de estado | Description |
|---|---|---|
| SXE o -xe | Break (Habilitado) |
Cuando se produce esta excepción, el objetivo entra inmediatamente en el modo depuración. 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 reinicio (Deshabilitado) |
El depurador no se activa para este tipo de excepción de primera oportunidad (aunque el depurador muestra un mensaje). Si otros manejadores de errores no pueden solucionar esta excepción, la ejecución se detiene y el objetivo entra 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 inicia en el depurador en absoluto. Sin embargo, se muestra un mensaje que informa al usuario de esta excepción. |
| SXI o -xi | Ignorar |
Cuando se produce esta excepción, la aplicación de destino no se interrumpe en el depurador y no se muestra ningún mensaje. |
Si una excepción no está prevista por una configuración SX*, la aplicación de destino se activa en el depurador en el segundo intento. El estado predeterminado de los eventos se muestra 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, selecciona Filtros de eventos en el menú Depurar, selecciona el evento que quieres de la lista en el cuadro de diálogo Filtros de eventos y, a continuación, selecciona Habilitado, Deshabilitado, Salida o Omitir.
Control del estado de manipulación
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 SX* pueden configurar el estado de manejo para identificadores no válidos, las instrucciones de interrupción STATUS_BREAKPOINT y las 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 interrumpe 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.
| Command | Nombre de estado | Description |
|---|---|---|
SXE |
Manejado |
El evento se considera controlado cuando se reanuda la ejecución. |
SXD,SXN,SXI |
No gestionado |
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 Handled (Controlado) o Not Handled (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 el comando Depurar | Filtros de eventos. Cada cadena de comandos 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 control de excepciones) o gn (Go con excepción no controlada).
Definiciones de eventos y valores predeterminados
Puede cambiar el estado de interrupción o el estado de manejo de las siguientes excepciones. Se indica su estado de interrupción predeterminado.
El estado de manejo predeterminado de las siguientes excepciones siempre es "No controlado". Tenga cuidado al 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 | Meaning | Estado de interrupción predeterminado |
|---|---|---|
asrt |
Error de aserción |
Inter |
Av |
Infracción de acceso |
Inter |
decímetro |
Datos desalineados |
Inter |
Dz |
División de enteros por cero |
Inter |
c000008e |
División de punto flotante por cero |
Inter |
eh |
Excepción EH de C++ |
Interrupción de segunda oportunidad |
Gp |
Infracción de página de protección |
Inter |
ii |
Instrucción ilegal |
Interrupción de segunda oportunidad |
iov |
Desbordamiento de enteros |
Inter |
IP |
Error de E/S en la página |
Inter |
Isc |
Llamada al sistema no válida |
Inter |
lsq |
Secuencia de bloqueo no válida |
Inter |
sbo |
Desbordamiento del búfer de pila |
Inter |
Sov |
Desbordamiento de pila |
Inter |
wkd |
Depurador de reactivación |
Inter |
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). |
Inter |
3c |
Terminación de la aplicación secundaria |
Interrupción de segunda oportunidad |
Ch |
Identificador no válido |
Inter |
Número |
Cualquier excepción numerada |
Interrupción de segunda oportunidad |
Nota Puede invalidar el estado de interrupción 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 gestione su estado de manejo, use sx* hc.
Puede cambiar el estado de interrupción o el estado de manejo de las siguientes excepciones. Se indica su estado de interrupción predeterminado.
El siguiente estado de control predeterminado de las 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 capturen 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 | Meaning | Estado de interrupción predeterminado |
|---|---|---|
dbce |
Excepción de comando del depurador especial |
Ignore |
vcpp |
Excepción especial de Visual C++ |
Ignore |
Wos |
Excepción de paso único de WOW64 |
Inter |
Wob |
Excepción de punto de interrupción WOW64: |
Inter |
Sse |
Excepción de un solo paso |
Inter |
BPE |
Excepción de punto de interrupción |
Inter |
cce |
CTRL+C o CTRL+INTERRUPCIÓN Esta excepción se desencadena si el destino es una aplicación de consola y se le pasa CTRL+C o CTRL+BREAK. |
Inter |
Nota Las tres excepciones finales de la tabla anterior tienen dos códigos de evento diferentes. Al controlar su estado de interrupción, use sse, bpe y cce. Cuando controle su estado de manejo, use ssec, bpec y cc.
Las excepciones siguientes son útiles al depurar código administrado.
| Código de evento | Meaning | Estado predeterminado |
|---|---|---|
Clr |
Excepción de Common Language Runtime |
Interrupción de segunda oportunidad No gestionado |
clrn |
Excepción de notificación del Common Language Runtime |
Interrupción de segunda oportunidad 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 | Meaning | Estado de interrupción predeterminado |
|---|---|---|
ser |
Error del sistema |
Ignore |
cpr[:Proceso] |
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 recuerda solo 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. |
Ignore |
epr[:Proceso] |
Salida del proceso Establecer el estado de interrupción de este evento se aplica solo 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 recuerda solo 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. |
Ignore |
Ct |
Creación de subprocesos |
Ignore |
et |
Salida de hilo |
Ignore |
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. |
Salida |
ud[:Módulo] |
Descargar 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 que coincida más adelante cuando se produzcan eventos de descarga. Rara vez, el depurador no tiene información de nombre para los eventos de descarga y solo puede identificar por 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 detiene cuando se descarga cualquier módulo. El depurador recuerda solo 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 Módulo. Si se omite Module , el evento se desencadena cuando se carga cualquier módulo. |
Salida |
out[:Salida] |
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, La salida no puede contener dos puntos o espacios. La coincidencia no es sensible a mayúsculas y minúsculas. Incluya un espacio o dos puntos entre salida y Salida. |
Ignore |
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: Interrumpir. 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, consulte Bloqueo y reinicio del equipo de destino. |
iml |
Carga inicial del módulo (solo en 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, consulte Bloqueo y reinicio del equipo de destino. |