
Un front-end de PowerShell para el motor del depurador de Windows.
Un front-end de PowerShell para el motor de depuración de Windows.
¿Listo para tabular tu camino hacia la gloria? Para una introducción más rápida, echa un vistazo a Introducción.
Este proyecto no es producido, respaldado ni supervisado por el equipo de depuradores de Windows. Si bien el equipo de depuradores agradece los comentarios sobre su API y front-ends (windbg, kd, etc.), no tienen ninguna conexión con este proyecto. No reporte errores ni envíe comentarios al equipo de depuradores sobre este proyecto.
Este no es un proyecto financiado: no tiene recursos oficiales asignados y solo lo trabajan voluntarios. No adquiera ninguna dependencia de producción de este proyecto a menos que esté dispuesto a soportarlo completamente por su cuenta. Siéntase libre de crear Issues y enviar Pull Requests, pero comprenda que con los limitados recursos de voluntarios, puede pasar un tiempo antes de que sus envíos sean procesados.
Este es un proyecto experimental: no está completamente maduro, y debe esperar que se realicen cambios disruptivos a menudo.
Corolario de los descargos anteriores: Evitaría adjuntar DbgShell a objetivos en vivo de alto valor.
https://aka.ms/dbgshell-latest
¿Alguna vez has intentado automatizar algo en el depurador? (cdb/ntsd/kd/windbg) ¿Cómo te fue?
El principal impulso para DbgShell es que es demasiado difícil automatizar cualquier cosa en el depurador. Por supuesto, existen facilidades hoy en día para ayudar a automatizar el depurador. Pero en mi opinión no están satisfaciendo las necesidades de la gente.
El objetivo del proyecto DbgShell es traer la bondad del mundo de PowerShell basado en objetos al mundo de la depuración. Cuando haces 'dt' para volcar un 'objeto', deberías obtener un objeto real. El scripting debería ser tan fácil como escribir un script de PowerShell.
El proyecto DbgShell proporciona un front-end de PowerShell para dbgeng.dll, incluyendo:
El host personalizado sigue siendo un programa de línea de comandos (basado en conhost.exe) (análogo a ntsd/cdb/kd), pero se puede invocar desde windbg (!DbgShell).
Además de hacer la automatización mucho más fácil y potente, también abordará otras preocupaciones, como la facilidad de uso para personas que no tienen que usar los depuradores tan a menudo. (una queja que he escuchado es que 'cuando termino necesitando usar windbg, paso todo mi tiempo en el .CHM')
Para los usuarios experimentados de windbg, por otro lado, otro objetivo es hacer la transición lo más fluida posible. Así, por ejemplo, el proveedor de espacio de nombres no es la única forma de acceder a los datos; todavía puedes usar comandos tradicionales como '~3 s', 'k', etc.
No me refiero solo a ese tipo de cosas donde abres un editor de texto y escribes un gran script para hacer algo complejo; también me refiero a poder crear cosas relativamente simples directamente en la línea de comandos. Hay muchas situaciones en las que te gustaría poder usar un poco de lógica, pero nada tan grande o reutilizable que incluso quisieras guardarlo. Debería ser fácil crear 'one-liners' como 'detener en CreateFile si el archivo que se abre está en el escritorio del usuario y la función Blah está en la pila'.
Déjame ser claro: me tomó aproximadamente 4 años 'calentarme' con PowerShell. Siento que tiene bordes afilados, aspectos que son simplemente difíciles, y muchos errores, tanto en diseño como en implementación. A veces realmente me irrita. Sin embargo, los beneficios de PowerShell son convincentes, y me han convencido de que es lo mejor para usar en este proyecto:
Get-Command, la finalización con tabulador, la capacidad de exponer datos jerárquicos como un sistema de archivos, las facilidades para proporcionar y sintetizar ayuda, son muy buenas.dt' para 'volcar' un 'objeto', y obtener realmente un objeto. DbgShell hace eso.cd' al sistema de archivos, registro, AD, etc.; puedes ejecutar Send-MailMessage, Get-WmiObject, Invoke-WebRequest, Invoke-RestMethod, ejecutar programas arbitrarios, etc.DbgShell ha estado en 'modo de prototipado' durante mucho tiempo. He pasado mucho tiempo averiguando cómo algo podría o debería hacerse, pero no necesariamente 'terminando' todo. Hay una gran cantidad de TODOs en el código actual. Así que aunque ha comenzado a ser realmente útil, el proyecto sigue siendo bastante verde. Sin embargo, definitivamente puede demostrar lo suficiente para darte una buena idea de cómo debería ser.
A continuación se muestran algunas capturas de pantalla. Es importante notar que nada de lo que ves es salida de texto de dbgeng. Aunque algunas cosas en la salida parecerán familiares, eso es solo porque he usado las características de formato y salida de PowerShell para personalizar cómo se muestran ciertos objetos: toda la salida que ves corresponde en realidad a objetos .NET reales y completos. Por ejemplo, esos mensajes ModLoad corresponden cada uno a un objeto MS.Dbg.ModuleLoadedEventArgs, que tiene más propiedades de las que se muestran cuando se envían a Out-Default. No hay análisis de cadenas de nada de dbgeng en absoluto. (Bueno... casi. He hecho algunas concesiones donde no hay otra forma de obtener información. Por ejemplo, cosas de desensamblado, o analizar el nombre simbólico de una función thunk de ajuste para encontrar el desplazamiento.)
Este es una especie de escenario 'hola mundo': adjuntarse a una instancia de cmd.exe. Primero uso el comando integrado de PowerShell Start-Process, luego canalizo la salida al comando de DbgShell Connect-Process, y luego hurgo en el espacio de nombres:

Aquí me he adjuntado a un programa de prueba, y he mirado la pila, cambiado a un marco de pila particular, volcado variables locales, inspeccionado el valor de un std::map local, e inspeccionado información de tipo para un valor de enumeración local. Observa la visualización del valor de enumeración: no solo DbgShell maneja la búsqueda del nombre simbólico para enumerados individuales, sino también cuando múltiples enumerados están combinados con OR. No puedes saberlo por la captura de pantalla, pero hay finalización con tabulador para todas estas cosas.

!dbgshell' para abrir una consola de DbgShell.Licenciado bajo la licencia MIT.
Este proyecto acepta contribuciones y sugerencias. La mayoría de las contribuciones requieren que aceptes un Acuerdo de Licencia de Contribuyente (CLA) que declare que tienes el derecho, y efectivamente lo haces, de concedernos los derechos para usar tu contribución. Para más detalles, visita https://cla.microsoft.com.
Cuando envías un pull request, un CLA-bot determinará automáticamente si necesitas proporcionar un CLA y decorará el PR adecuadamente (por ejemplo, etiqueta, comentario). Simplemente sigue las instrucciones proporcionadas por el bot. Solo necesitarás hacer esto una vez en todos los repos que usen nuestro CLA.
Consulta Contributing para más información sobre cómo contribuir al proyecto.
Este proyecto ha adoptado el Código de Conducta de Código Abierto de Microsoft.
Para más información, consulta las Preguntas Frecuentes del Código de Conducta o contacta a [email protected] con cualquier pregunta o comentario adicional.
Puedes encontrar una breve introducción en video (3 minutos) aquí: https://youtu.be/ynbg2zZ1Igc