Habilitación de la depuración postmortem

Control de excepciones en modo de usuario

Excepciones y puntos de interrupción

Los errores de aplicación más comunes se denominan excepciones. Entre ellas se incluyen infracciones de acceso, errores de división por cero, desbordamientos numéricos, excepciones clR y muchos otros tipos de errores. Las aplicaciones también pueden provocar interrupciones de punto de interrupción. Estos se producen cuando Windows no puede ejecutar la aplicación (por ejemplo, cuando no se puede cargar un módulo necesario) o cuando se encuentra un punto de interrupción. Un depurador puede insertar puntos de interrupción en el código o invocarlos a través de una función como DebugBreak.

Prioridad de los controladores de excepciones

En función de los valores de configuración y de qué depuradores están activos, Windows controla los errores en modo de usuario de varias maneras. En la secuencia siguiente se muestra la precedencia usada para el control de errores del modo de usuario:

  1. Si un depurador en modo de usuario está asociado actualmente al proceso de error, todos los errores harán que el destino se interrumpa en este depurador.

    Siempre que se adjunte el depurador en modo de usuario, no se usará ningún otro método de control de errores, incluso si se usa el comando gn (Go With Exception Not Handled).

  2. Si no se adjunta ningún depurador en modo de usuario y el código en ejecución tiene sus propias rutinas de control de excepciones (por ejemplo, pruebe, excepto ), esta rutina de control de excepciones intentará tratar el error.

  3. Si no hay ningún depurador en modo de usuario conectado y Windows tiene una conexión abierta de depuración de kernel y el error es una interrupción de punto de interrupción, Windows intentará ponerse en contacto con el depurador de kernel.

    Las conexiones de depuración de kernel deben abrirse durante el proceso de arranque de Windows. Si desea evitar que una interrupción en modo de usuario se interrumpa en el depurador de kernel, puede usar la utilidad KDbgCtrl con el parámetro -du . Para obtener más información sobre cómo configurar las conexiones de depuración de kernel y cómo usar KDbgCtrl, consulte Getting Set Up for Debugging (Getting Set Up for Debugging).

    En el depurador de kernel, puede usar gh (Go With Exception Handled) para ignorar el error y continuar ejecutando el destino. Puede usar gn (Ir con excepción no controlada) para omitir el depurador de kernel y continuar con el paso 4.

  4. Si no se aplican las condiciones de los pasos 1, 2 y 3, Windows activará una herramienta de depuración configurada en los valores del Registro AeDebug. Cualquier programa se puede seleccionar de antemano como herramienta para usarla en esta situación. El programa elegido se conoce como depurador postmortem.

  5. Si no se aplican las condiciones de los pasos 1, 2 y 3, y no hay ningún depurador posterior registrado, Informe de errores de Windows (WER) muestra un mensaje y proporciona soluciones si hay alguna disponible. WER también escribe un archivo de volcado de memoria si los valores adecuados se establecen en el Registro. Para obtener más información, consulte Uso de WER y Recopilación de volcados en modo de usuario.

Función DebugBreak

Si se ha instalado un depurador postmortem, puede interrumpir deliberadamente el depurador desde una aplicación en modo de usuario llamando a la función DepurarBreak .

Especificación de un depurador postmortem

En esta sección se describe cómo configurar herramientas como WinDbg como depurador postmortem. Una vez configurado, el depurador postmortem se iniciará automáticamente cada vez que se bloquee una aplicación.

Claves del Registro posteriores al depurador de Mortem

Informe de errores de Windows (WER) crea el proceso del depurador posterior mediante los valores establecidos en la clave del Registro AeDebug.

HKLM\Software\Microsoft\Windows NT\CurrentVersion\AeDebug

Hay dos valores principales del Registro de interés, Debugger y Auto. El valor del Registro del depurador especifica la línea de comandos del depurador postmortem. El valor del Registro automático especifica si el depurador postmortem se inicia automáticamente o si se presenta primero un cuadro de mensaje de confirmación.

Depurador (REG_SZ)

Este REG_SZ valor especifica el depurador que controlará la depuración posterior.

La ruta de acceso completa al depurador debe aparecer a menos que el depurador se encuentre en un directorio que esté en la ruta de acceso predeterminada.

La línea de comandos se genera a partir de la cadena del depurador a través de una llamada de estilo printf que incluye 3 parámetros. Aunque el orden es fijo, no es necesario usar ninguno o todos los parámetros disponibles.

DWORD (%ld): id. de proceso del proceso de destino.

DWORD (%ld): identificador de eventos duplicado en el proceso del depurador posterior. Si el depurador postmortem indica el evento, WER continuará el proceso de destino sin esperar a que finalice el depurador posterior. El evento solo debe indicarse si se ha resuelto el problema. Si el depurador posterior finaliza sin indicar el evento, WER continúa la recopilación de información sobre los procesos de destino.

void* (%p): dirección de una estructura de JIT_DEBUG_INFO asignada en el espacio de direcciones del proceso de destino. La estructura contiene información y contexto de excepciones adicionales.

Auto (REG_SZ) Este valor de REG_SZ siempre es 0 o 1.

Si Auto está establecido en 0, se muestra un cuadro de mensaje de confirmación antes de iniciar el proceso de depuración posterior.

Si Auto se establece en 1, se crea inmediatamente el depurador postmortem.

Al editar manualmente el registro, hágalo con mucho cuidado, ya que es posible que los cambios incorrectos en el registro no permitan que Windows arranque.

Ejemplo de uso de la línea de comandos

Muchos depuradores posteriores usan una línea de comandos que incluye modificadores -p y -e para indicar que los parámetros son un PID y event (respectivamente). Por ejemplo, la instalación de WinDbg mediante windbg.exe -I crea los siguientes valores:

Debugger = "<Path>\WinDbg -p %ld -e %ld -g"
Auto = 1

Hay flexibilidad en la forma en que se pueden usar los parámetros WER %ld %ld %p. Por ejemplo. no es necesario especificar ningún modificador alrededor o entre los parámetros WER. Por ejemplo, la instalación de Windows Sysinternals ProcDump mediante procdump.exe -i crea los siguientes valores sin modificadores entre los parámetros WER %ld %ld %p:

Debugger = "<Path>\procdump.exe" -accepteula -j "c:\Dumps" %ld %ld %p
Auto = 1

Depuradores de 32 y 64 bits

En una plataforma de 64 bits, los valores del Registro Depurador (REG_SZ) y Automático (REG_SZ) se definen individualmente para aplicaciones de 64 y 32 bits. Se usa una clave adicional de Windows en Windows (WOW) para almacenar los valores de depuración post mortem de la aplicación de 32 bits.

HKLM\Software\Wow6432Node\Microsoft\Windows NT\CurrentVersion\AeDebug

En una plataforma de 64 bits, use un depurador post-mortem de 32 bits para procesos de 32 bits y un depurador de 64 bits para procesos de 64 bits. Esto evita que un depurador de 64 bits se centre en los subprocesos WOW64, en lugar de los subprocesos de 32 bits, en un proceso de 32 bits.

Para muchos depuradores postmortem, incluidas las herramientas de depuración para depuradores postmortem de Windows, esto implica ejecutar el comando de instalación dos veces; una vez con la versión x86 y una vez con la versión x64. Por ejemplo, para usar WinDbg como depurador postmortem interactivo, el windbg.exe -I comando se ejecutaría dos veces, una por cada versión.

Instalación de 64 bits:

C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\windbg.exe –I

Esto actualiza la clave del Registro con estos valores.

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug
Debugger = "C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\windbg.exe" -p %ld -e %ld –g

Instalación de 32 bits:

C:\Program Files (x86)\Windows Kits\10\Debuggers\x86\windbg.exe –I

Esto actualiza la clave del Registro con estos valores.

HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows NT\CurrentVersion\AeDebug
Debugger = "C:\Program Files (x86)\Windows Kits\10\Debuggers\x86\windbg.exe" -p %ld -e %ld –g

Configuración de depuradores post Mortem

Herramientas de depuración para Windows

Las herramientas de depuración para depuradores de Windows admiten la configuración como depurador posterior. El comando install pretende que el proceso se depura de forma interactiva.

WinDbg

Para establecer el depurador postmortem en WinDbg, ejecute windbg -I. (Debe I escribirse en mayúsculas). Este comando mostrará un mensaje correcto o de error después de usarlo. Para trabajar con aplicaciones de 32 y 64 bits, ejecute el comando para los depuradores de 64 y 32.

C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\windbg.exe –I
C:\Program Files (x86)\Windows Kits\10\Debuggers\x86\windbg.exe –I

Así es como se configurará la entrada del Registro AeDebug cuando windbg -I se ejecute.

Debugger = "<Path>\WinDbg -p %ld -e %ld -g"
Auto = 1

En los ejemplos, <Path> es el directorio donde se encuentra el depurador.

Los parámetros -p y -e pasan el identificador de proceso y el evento, como se explicó anteriormente.

- g pasa el comando g (Go) a WinDbg y continúa la ejecución desde la instrucción actual.

Nota Hay un problema importante al pasar el comando g (Go). El problema con este enfoque es que las excepciones no siempre se repiten, normalmente, debido a una condición transitoria que ya no existe cuando se reinicia el código. Para obtener más información sobre este problema, vea .jdinfo (Usar JIT_DEBUG_INFO).

Para evitar este problema, use .jdinfo o .dump /j. Este enfoque permite que el depurador esté en el contexto del error de código de interés. Para obtener más información, vea Depuración Just-In-Time (JIT) más adelante en este tema.

CDB

Para establecer el depurador postmortem en CDB, ejecute cdb -iae (Install AeDebug) o cdb -iaec KeyString (Install AeDebug with Command).

C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\cdb.exe -iae
C:\Program Files (x86)\Windows Kits\10\Debuggers\x86\cdb.exe -iae

Cuando se usa el parámetro -iaec , KeyString especifica una cadena que se va a anexar al final de la línea de comandos usada para iniciar el depurador postmortem. Si KeyString contiene espacios, debe incluirse entre comillas.

C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\cdb.exe -iaec [KeyString]
C:\Program Files (x86)\Windows Kits\10\Debuggers\x86\cdb.exe -iaec [KeyString]

Este comando no muestra nada si se realiza correctamente y un mensaje de error si se produce un error.

NTSD

Para establecer el depurador postmortem en NTSD, ejecute ntsd -iae (Install AeDebug) o ntsd -iaec KeyString (Install AeDebug with Command).

C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\ntsd.exe -iae
C:\Program Files (x86)\Windows Kits\10\Debuggers\x86\ntsd.exe -iae

Cuando se usa el parámetro -iaec , KeyString especifica una cadena que se va a anexar al final de la línea de comandos usada para iniciar el depurador postmortem. Si KeyString contiene espacios, debe incluirse entre comillas.

C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\ntsd.exe -iaec [KeyString]
C:\Program Files (x86)\Windows Kits\10\Debuggers\x86\ntsd.exe -iaec [KeyString]

Este comando no muestra nada si se ejecuta correctamente y se produce un error en una nueva ventana de consola en caso de error.

Nota Dado que los parámetros -p %ld -e %ld -g siempre aparecen primero en la línea de comandos del depurador postmortem, no debe usar el modificador -iaec para especificar el parámetro -server porque -server no funcionará a menos que aparezca primero en la línea de comandos. Para instalar un depurador postmortem que incluya este parámetro, debe editar el registro manualmente.

Depurador JIT de Visual Studio

Si se ha instalado Visual Studio, vsjitdebugger.exe se registrará como depurador post mortem. El depurador JIT de Visual Studio pretende depurar el proceso de forma interactiva.

Debugger = "C:\WINDOWS\system32\vsjitdebugger.exe" -p %ld -e %ld

Si Visual Studio se actualiza o vuelve a instalar, esta entrada se volverá a escribir, sobrescribir cualquier conjunto de valores alternativos.

Ventana Sysinternals ProcDump

La utilidad ProcDump de Sysinternals de Windows también se puede usar para la captura de volcado de memoria posterior. Para obtener más información sobre el uso y la descarga de ProcDump, consulte ProcDump.

Al igual que el comando WinDbg .dump , ProcDump puede capturar un volcado de memoria del bloqueo de forma no interactiva. La captura puede producirse en cualquier sesión del sistema Windows.

ProcDump se cierra cuando se completa la captura del archivo de volcado, WER notifica el error y el proceso de error finaliza.

Use procdump -i para instalar procdump y -you para desinstalar ProcDump para la depuración post mortem de 32 y 64 bits.

<Path>\procdump.exe -i

Los comandos de instalación y desinstalación generan los valores del Registro modificados correctamente y los errores en caso de error.

Las opciones de línea de comandos de ProcDump del Registro se establecen en:

Debugger = <Path>\ProcDump.exe -accepteula -j "<DumpFolder>" %ld %ld %p

ProcDump usa los 3 parámetros: PID, Event y JIT_DEBUG_INFO. Para obtener más información sobre el parámetro JIT_DEBUG_INFO, consulte Depuración Just-In-Time (JIT) a continuación.

El tamaño de volcado de memoria capturado tiene como valor predeterminado Mini (process/threads/handles/modules/address space) sin un conjunto de opciones de tamaño, MiniPlus (Mini plus MEM_PRIVATE pages) con -mp set o Full (toda la memoria , equivalente a ".dump /mA") con -ma set.

En el caso de los sistemas con suficiente espacio de unidad, se recomienda una captura completa (-ma).

Use -ma con la opción -i para especificar una captura de toda la memoria. Opcionalmente, proporcione una ruta de acceso para los archivos de volcado de memoria.

<Path>\procdump.exe -ma -i c:\Dumps

En el caso de los sistemas con espacio limitado en unidades, se recomienda una captura de MiniPlus (-mp).

<Path>\procdump.exe -mp -i c:\Dumps

La carpeta en la que guardar el archivo de volcado de memoria es opcional. El valor predeterminado es la carpeta actual. La carpeta debe protegerse con una ACL que sea igual o mejor que lo que se usa para C:\Windows\Temp. Para obtener más información sobre cómo administrar la seguridad relacionada con las carpetas, vea Seguridad durante la depuración postmortem.

Para desinstalar ProcDump como depurador postmortem y restaurar la configuración anterior, use la opción -u (Desinstalar).

<Path>\procdump.exe -u

Para obtener más información sobre ProcDump, consulte Referencia del administrador de ProcDump y Windows SysInternals de Mark Russinovich y Aaron Margosis publicada por Microsoft Press.

Depuración Just-In-Time (JIT)

Establecer contexto en la aplicación con errores

Como se explicó anteriormente, es muy conveniente establecer el contexto en la excepción que provocó el bloqueo mediante el parámetro JIT_DEBUG_INFO. Para obtener más información sobre esto, vea .jdinfo (Usar JIT_DEBUG_INFO).

Herramientas de depuración para Windows

En este ejemplo se muestra cómo editar el Registro para ejecutar un comando inicial (-c) que usa el comando de dirección> .jdinfo <para mostrar la información de excepción adicional y cambiar el contexto a la ubicación de la excepción (similar a cómo se usa .ecxr para establecer el contexto en el registro de excepciones).

Debugger = "<Path>\windbg.exe -p %ld -e %ld -c ".jdinfo 0x%p"
Auto = 1

El parámetro %p es la dirección de una estructura de JIT_DEBUG_INFO en el espacio de direcciones del proceso de destino. El parámetro %p se anexa previamente con 0x para que se interprete como un valor hexadecimal. Para obtener más información, vea .jdinfo (Usar JIT_DEBUG_INFO) .

Para depurar una combinación de aplicaciones de 32 y 64 bits, configure las claves del Registro de 32 y 64 bits (descritas anteriormente), estableciendo la ruta de acceso adecuada a la ubicación del WinDbg.exe de 64 y 32 bits.

Creación de un archivo de volcado mediante .dump

Para capturar un archivo de volcado de memoria siempre que se produzca un error que incluya los datos de JIT_DEBUG_INFO, use la dirección> .dump /j<.

<Path>\windbg.exe -p %ld -e %ld -c ".dump /j %p /u <DumpPath>\AeDebug.dmp; qd"

Use la opción /u para generar un nombre de archivo único para permitir que se creen automáticamente varios archivos de volcado de memoria. Para obtener más información sobre las opciones, vea .dump (Crear archivo de volcado de memoria).

El volcado de memoria creado tendrá los datos JITDEBUG_INFO almacenados como contexto de excepción predeterminado. En lugar de usar .jdinfo para ver la información de excepción y establecer el contexto, use .exr -1 para mostrar el registro de excepción y .ecxr para establecer el contexto. Para obtener más información, vea .exr (Mostrar registro de excepciones) y .ecxr (Mostrar registro de contexto de excepción) .

Informe de errores de Windows - q /qd

La forma en que finaliza la sesión de depuración determina si Informe de errores de Windows notifica el error.

Si la sesión de depuración se desasocia mediante qd antes del cierre del depurador, WER notificará el error.

Si la sesión de depuración se deja de usar q (o si el depurador está cerrado sin desasociar), WER no notificará el error.

Anexar ; q o ; qd al final de la cadena de comandos para invocar el comportamiento deseado.

Por ejemplo, para permitir que WER notifique el error después de que CDB capture un volcado de memoria, configure esta cadena de comandos.

<Path>\cdb.exe -p %ld -e %ld -c ".dump /j 0x%p /u c:\Dumps\AeDebug.dmp; qd"

Este ejemplo permitiría que WER notifique el error después de que WinDbg capture un volcado de memoria.

<Path>\windbg.exe -p %ld -e %ld -c ".dump /j %p /u <DumpPath>\AeDebug.dmp; qd""

Vulnerabilidades de seguridad

Si está pensando en habilitar la depuración postmortem en un equipo que comparte con otras personas, consulte Seguridad durante la depuración postmortem.