Habilitación de la depuración postmortem

Control de excepciones del 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.

Precedencia 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án otros métodos 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 con el error.

  3. Si no hay ningún depurador en modo de usuario asociado y Windows tiene una conexión de depuración de kernel abierta 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 conexiones de depuración de kernel y cómo usar KDbgCtrl, consulte Getting Set Up for Debugging (Cómo configurar la depuración).

    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 usar 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 de User-Mode.

Función DebugBreak

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

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 del depurador de Post 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 posterior. 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 debugger 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): identificador de proceso del proceso de destino.

DWORD (%ld): identificador de eventos duplicado en el proceso del depurador posterior. Si el depurador postmortem señala 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 adicional de excepciones y contexto.

Automático (REG_SZ) Este valor de REG_SZ siempre es 0 o 1.

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

Si Auto está establecido en 1, se crea inmediatamente el depurador posterior.

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 un evento (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 cómo 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, al instalar Windows Sysinternals ProcDump mediante procdump.exe -i se crean 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 Auto (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 posteriores al 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 posterior a 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 posteriores, incluidas las herramientas de depuración para depuradores posteriores a 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 de postmortem interactivo, el windbg.exe -I comando se ejecutaría dos veces, una vez para 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 posteriores a Mortem

Herramientas de depuración para Windows

Todas las herramientas de depuración para depuradores de Windows admiten la configuración como depurador posterior. El comando install pretende depurar el proceso de forma interactiva.

WinDbg

Para establecer el depurador postmortem en WinDbg, ejecute windbg -I. (Debe I incluirse en mayúsculas). Este comando mostrará un mensaje de operación correcta o de error después de su uso. 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 -iaecKeyString (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 que se usa para iniciar el depurador posterior. Si KeyString contiene espacios, debe ir 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 ejecuta correctamente y un mensaje de error si se produce un error.

NTSD

Para establecer el depurador postmortem en NTSD, ejecute ntsd -iae (Instalar AeDebug) o ntsd -iaecKeyString (Instale AeDebug con 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 que se usa para iniciar el depurador posterior. Si KeyString contiene espacios, debe ir 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 realiza correctamente y 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 posterior que incluya este parámetro, debe editar el registro manualmente.

Depurador JIT de Visual Studio

Si Visual Studio se ha instalado, 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, sobrescribiendo los valores alternativos establecidos.

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 descarga de ProcDump, consulte ProcDump.

Al igual que el comando .dump WinDbg, 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 se finaliza el proceso de error.

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 del volcado 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 en 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 la unidad, 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, consulte 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 ha explicado 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 .jdinfo <address> 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, establezca 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 de memoria mediante .dump

Para capturar un archivo de volcado de memoria cada vez 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 con qd antes del cierre del depurador, WER notificará el error.

Si la sesión de depuración 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, configure esta cadena de comandos.

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

En este ejemplo se 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 posterior.