Eventos de depuración

Un evento de depuración es un incidente en el proceso que se está depurando que hace que el sistema notifique al depurador. Los eventos de depuración incluyen la creación de un proceso, la creación de un subproceso, la carga de una biblioteca de vínculos dinámicos (DLL), la descarga de un archivo DLL, el envío de una cadena de salida y la generación de una excepción.

Si se produce un evento de depuración mientras un depurador está esperando uno, el sistema rellena la estructura de DEBUG_EVENT especificada por WaitForDebugEvent con información que describe el evento.

Cuando el sistema notifica al depurador de un evento de depuración, también suspende todos los subprocesos del proceso afectado. Los subprocesos no reanudan la ejecución hasta que el depurador continúa el evento de depuración mediante ContinueDebugEvent. Es posible que se produzcan los siguientes eventos de depuración mientras se depura un proceso.

Evento de depuración Descripción
CREATE_PROCESS_DEBUG_EVENT
Se genera cada vez que se crea un nuevo proceso en un proceso que se está depurando o cada vez que el depurador comienza a depurar un proceso ya activo. El sistema genera este evento de depuración antes de que el proceso comience a ejecutarse en modo de usuario y antes de que el sistema genere cualquier otro evento de depuración para el nuevo proceso.
La estructura DEBUG_EVENT contiene una estructura de CREATE_PROCESS_DEBUG_INFO . Esta estructura incluye un identificador para el nuevo proceso, un identificador para el archivo de imagen del proceso, un identificador para el subproceso inicial del proceso y otra información que describe el nuevo proceso.
El identificador del proceso tiene acceso PROCESS_VM_READ y PROCESS_VM_WRITE. Si un depurador tiene estos tipos de acceso a un subproceso, puede leer y escribir en la memoria del proceso mediante las funciones ReadProcessMemory y WriteProcessMemory . Si el sistema informó previamente de un evento de EXIT_PROCESS_DEBUG_EVENT, el sistema cierra este identificador cuando el depurador llama a la función ContinueDebugEvent .
El identificador del archivo de imagen del proceso tiene GENERIC_READ acceso y se abre para el uso compartido de lectura. El depurador debe cerrar este identificador mientras se procesa CREATE_PROCESS_DEBUG_EVENT.
El identificador del subproceso inicial del proceso tiene THREAD_GET_CONTEXT, THREAD_SET_CONTEXT y THREAD_SUSPEND_RESUME acceso al subproceso. Si un depurador tiene estos tipos de acceso a un subproceso, puede leer y escribir en los registros del subproceso mediante las funciones GetThreadContext y SetThreadContext y puede suspender y reanudar el subproceso mediante las funciones SuspendThread y ResumeThread . Si el sistema informó previamente de un evento de EXIT_PROCESS_DEBUG_EVENT, el sistema cierra este identificador cuando el depurador llama a la función ContinueDebugEvent .
CREATE_THREAD_DEBUG_EVENT
Se genera cada vez que se crea un nuevo subproceso en un proceso que se está depurando o cada vez que el depurador comienza a depurar un proceso ya activo. Este evento de depuración se genera antes de que el nuevo subproceso comience a ejecutarse en modo de usuario.
La estructura DEBUG_EVENT contiene una estructura CREATE_THREAD_DEBUG_INFO . Esta estructura incluye un identificador para el nuevo subproceso y la dirección inicial del subproceso. El identificador tiene acceso THREAD_GET_CONTEXT, THREAD_SET_CONTEXT y THREAD_SUSPEND_RESUME al subproceso. Si un depurador tiene estos tipos de acceso a un subproceso, puede leer y escribir en los registros del subproceso mediante las funciones GetThreadContext y SetThreadContext y puede suspender y reanudar el subproceso mediante las funciones SuspendThread y ResumeThread .
Si el sistema informó anteriormente de un evento de EXIT_THREAD_DEBUG_EVENT, el sistema cierra el identificador al nuevo subproceso cuando el depurador llama a la función ContinueDebugEvent .
EXCEPTION_DEBUG_EVENT
Se genera cada vez que se produce una excepción en el proceso que se está depurando. Entre las posibles excepciones se incluyen intentar acceder a la memoria inaccesible, ejecutar instrucciones de punto de interrupción, intentar dividir por cero o cualquier otra excepción que se indique en Control de excepciones estructurados.
La estructura DEBUG_EVENT contiene una estructura EXCEPTION_DEBUG_INFO . Esta estructura describe la excepción que provocó el evento de depuración.
Además de las condiciones de excepción estándar, puede producirse un código de excepción adicional durante la depuración del proceso de consola. El sistema genera un código de excepción DBG_CONTROL_C cuando CTRL+C está introduciendo en un proceso de consola que controla las señales CTRL+C y se está depurando. Este código de excepción no está pensado para ser controlado por las aplicaciones. Una aplicación nunca debe usar un controlador de excepciones para tratarlo. Se genera solo para la ventaja del depurador y solo se usa cuando se adjunta un depurador al proceso de consola.
Si no se depura un proceso o si el depurador pasa a la excepción DBG_CONTROL_C no controlada (a través del comando gn), se busca en la lista de funciones de controlador de la aplicación, como se documenta para la función SetConsoleCtrlHandler .
Si el depurador controla la excepción de DBG_CONTROL_C (a través del comando gh), una aplicación no observará ctrl+C, excepto en el código como este.
while ((inputChar = getchar()) != EOF) ...
Por lo tanto, el depurador no se puede usar para detener la espera de lectura en dicho código de terminación.
EXIT_PROCESS_DEBUG_EVENT
Se genera cada vez que se cierra el último subproceso de un proceso que se está depurando. Este evento de depuración se produce inmediatamente después de que el sistema descargue los archivos DLL del proceso y actualice el código de salida del proceso.
La estructura DEBUG_EVENT contiene una estructura EXIT_PROCESS_DEBUG_INFO que especifica el código de salida.
El depurador desasigna las estructuras internas asociadas al proceso al recibir este evento de depuración. El sistema cierra el identificador del depurador para el proceso de salida y todos los subprocesos del proceso. El depurador no debe cerrar estos identificadores.
La parte del modo kernel del apagado del proceso no se puede completar hasta que el depurador que recibe este evento llama a ContinueDebugEvent. Hasta entonces, los identificadores de proceso están abiertos y el espacio de direcciones virtuales no se libera, por lo que el depurador puede examinar el proceso secundario. Para recibir una notificación cuando se complete la parte en modo kernel del apagado del proceso, duplique el identificador devuelto con CREATE_PROCESS_DEBUG_EVENT, llame a ContinueDebugEvent y espere a que se señale el identificador de proceso duplicado.
EXIT_THREAD_DEBUG_EVENT
Se genera cada vez que se cierra un subproceso que forma parte de un proceso que se está depurando. El sistema genera este evento de depuración inmediatamente después de actualizar el código de salida del subproceso.
La estructura DEBUG_EVENT contiene una estructura EXIT_THREAD_DEBUG_INFO que especifica el código de salida.
Este evento de depuración no se produce si el subproceso de salida es el último subproceso de un proceso. En este caso, el evento de depuración EXIT_PROCESS_DEBUG_EVENT se produce en su lugar.
El depurador desasigna las estructuras internas asociadas al subproceso al recibir este evento de depuración. El sistema cierra el identificador del depurador al subproceso que sale. El depurador no debe cerrar este identificador.
LOAD_DLL_DEBUG_EVENT
Se genera cada vez que un proceso que se depura carga un archivo DLL. Este evento de depuración se produce cuando el cargador del sistema resuelve vínculos a un archivo DLL o cuando el proceso depurado usa la función LoadLibrary . Este evento de depuración solo se produce la primera vez que el sistema adjunta un archivo DLL al espacio de direcciones virtuales de un proceso.
La estructura DEBUG_EVENT contiene una estructura de LOAD_DLL_DEBUG_INFO . Esta estructura incluye un identificador para el archivo DLL recién cargado, la dirección base del archivo DLL y otra información que describe el archivo DLL. El depurador debe cerrar el identificador del identificador DLL al procesar LOAD_DLL_DEBUG_EVENT.
Normalmente, un depurador carga una tabla de símbolos asociada al archivo DLL al recibir este evento de depuración.
OUTPUT_DEBUG_STRING_EVENT
Se genera cuando un proceso que se depura usa
Función OutputDebugString . La estructura DEBUG_EVENT contiene una estructura de OUTPUT_DEBUG_STRING_INFO . Esta estructura especifica la dirección, la longitud y el formato de la cadena de depuración.
UNLOAD_DLL_DEBUG_EVENT
Se genera cada vez que un proceso que se depura descarga un archivo DLL mediante la función FreeLibrary . Este evento de depuración solo se produce la última vez que se descarga un archivo DLL desde el espacio de direcciones de un proceso (es decir, cuando el recuento de uso del archivo DLL es cero).
La estructura DEBUG_EVENT contiene una estructura UNLOAD_DLL_DEBUG_INFO . Esta estructura especifica la dirección base del archivo DLL en el espacio de direcciones del proceso que descarga el archivo DLL.
Normalmente, un depurador descarga una tabla de símbolos asociada al archivo DLL al recibir este evento de depuración.
Cuando se cierra un proceso, el sistema descarga automáticamente los archivos DLL del proceso, pero no genera un evento de depuración UNLOAD_DLL_DEBUG_EVENT.
RIP_EVENT
Se genera cada vez que un proceso que se depura se muere fuera del control del depurador del sistema.
La estructura DEBUG_EVENT contiene una estructura de RIP_INFO . Esta estructura especifica el error y el tipo de error.