DbgRs es un proyecto personal de Tim Misiak, exintegrante del equipo de la plataforma Microsoft Debugger, que consiste en construir un depurador desde cero en Rust. El autor explica que ya abandonó ese equipo de Microsoft en dos ocasiones y en ambas comenzó un depurador propio; esta vez persigue dos objetivos: profundizar en Rust aprovechando un dominio que ya domina, y ofrecer un recurso didáctico accesible sobre el funcionamiento interno de un depurador. La elección de Rust resulta útil porque crates de terceros resuelven tareas como símbolos o desensamblado, lo que permite centrarse en las ideas centrales.
El artículo aclara qué es un depurador: una herramienta capaz de analizar tanto un sistema en ejecución como una instantánea estática, como un archivo core, un volcado de memoria o una instantánea de máquina virtual. Ejemplos habituales son GDB, LLDB, Visual Studio y WinDbg. La primera entrega se centra en depuración en vivo en modo usuario sobre Windows, aunque los conceptos son trasladables a otros sistemas operativos, con diferencias en las API y en la terminología.
En Windows, las API básicas de depuración están documentadas en MSDN. Sobre ellas existe una capa superior, DbgEng, a la que se accede mediante la interfaz IDebugClient y API relacionadas, que ofrece capacidades avanzadas como desenrollado de pila, análisis de símbolos, control de flujo, desensamblado y scripting. Aunque DbgEng es más potente para automatizar tareas, el proyecto opta por implementar el depurador con las API más elementales del sistema operativo.
El núcleo de una sesión de depuración en vivo es un bucle de eventos. El depurador se asocia a un proceso objetivo y queda registrado para recibir sus eventos de depuración; cuando ocurre uno, el sistema operativo congela el proceso y notifica al depurador con la información correspondiente, dándole la oportunidad de examinar o manipular el estado antes de continuar la ejecución.
Para asociarse a un proceso en Windows hay dos vías. La primera es DebugActiveProcess, que recibe el identificador de un proceso ya en ejecución y crea una conexión implícita entre depurador y objetivo; para finalizar la asociación se emplea DebugActiveProcessStop. La segunda consiste en lanzar el proceso ya marcado para depuración con CreateProcessW, utilizando los flags DEBUG_ONLY_THIS_PROCESS o DEBUG_PROCESS en dwCreationFlags: el primero limita la depuración al proceso iniciado y el segundo la extiende a todos sus procesos hijo.
El artículo muestra el fragmento de código Rust que invoca CreateProcessW, detallando cada parámetro: línea de comandos, atributos, flags de creación (con DEBUG_ONLY_THIS_PROCESS y CREATE_NEW_CONSOLE para no compartir consola con la aplicación objetivo), punteros nulos en campos opcionales y estructuras STARTUPINFOEXW y PROCESS_INFORMATION. Al regresar, el proceso queda suspendido hasta que el depurador empiece a gestionar sus eventos de depuración, paso que aborda la siguiente entrega mediante las funciones WaitForDebugEvent y ContinueDebugEvent, que cierran el bucle de eventos.
