
Un front-end PowerShell pour le moteur de débogage Windows.
Un frontal PowerShell pour le moteur de débogage Windows.
Prêt à tabuler votre chemin vers la gloire ? Pour une introduction rapide, jetez un œil à Pour commencer.
Ce projet n'est pas produit, approuvé ni surveillé par l'équipe de débogage Windows. Bien que l'équipe de débogage accueille les commentaires concernant leur API et leurs interfaces (windbg, kd, etc.), elle n'a aucun lien avec ce projet. Ne signalez pas de bogues ou de retours à l'équipe de débogage concernant ce projet.
Ce projet n'est pas financé : aucune ressource officielle ne lui est allouée, et il n'est travaillé que par des bénévoles. Ne prenez aucune dépendance de production sur ce projet à moins d'être prêt à le supporter entièrement vous-même. N'hésitez pas à signaler des problèmes et à soumettre des Pull Requests, mais sachez qu'avec des ressources bénévoles limitées, il faudra peut-être un certain temps avant que vos soumissions soient traitées.
Ce projet est expérimental : il n'est pas complètement abouti, et vous devez vous attendre à des changements cassants souvent.
Corollaire des avertissements ci-dessus : j'éviterais d'attacher DbgShell à des cibles en direct de grande valeur.
https://aka.ms/dbgshell-latest
Avez-vous déjà essayé d'automatiser quelque chose dans le débogueur ? (cdb/ntsd/kd/windbg) Comment cela s'est-il passé pour vous ?
La principale impulsion pour DbgShell est qu'il est tout simplement beaucoup trop difficile d'automatiser quoi que ce soit dans le débogueur. Il existe certes des outils aujourd'hui pour aider à automatiser le débogueur, bien sûr. Mais à mon avis, ils ne répondent pas aux besoins des gens.
L'objectif du projet DbgShell est d'apporter la bonté du monde objet de PowerShell au monde du débogage. Lorsque vous faites 'dt' pour vider un 'objet', vous devriez obtenir un objet réel. Le script devrait être aussi simple que d'écrire un script PowerShell.
Le projet DbgShell fournit une interface PowerShell pour dbgeng.dll, comprenant :
L'hôte personnalisé est toujours un programme en ligne de commande (basé sur conhost.exe) (analogue à
ntsd/cdb/kd), mais il peut être invoqué depuis windbg (!DbgShell).
En plus de rendre l'automatisation beaucoup plus facile et plus puissante, il répondra également à d'autres préoccupations, telles que la facilité d'utilisation pour les personnes qui n'ont pas à utiliser les débogueurs si souvent. (une plainte que j'ai entendue est que « quand je finis par devoir utiliser windbg, je passe tout mon temps dans le .CHM »)
Pour les utilisateurs expérimentés de windbg, d'autre part, un autre objectif est de rendre la transition aussi
transparente que possible. Ainsi, par exemple, le fournisseur d'espace de noms n'est pas le seul moyen
d'accéder aux données ; vous pouvez toujours utiliser des commandes traditionnelles comme « ~3 s », « k », etc.
Je ne parle pas uniquement de ce genre de choses où vous ouvrez un éditeur de texte et écrivez un gros script pour faire quelque chose de complexe—je parle aussi de pouvoir sortir des choses relativement simples directement en ligne de commande. Il existe de nombreuses situations où vous aimeriez pouvoir utiliser un peu de logique, mais rien d'assez gros ou réutilisable pour que vous vouliez même le sauvegarder. Il devrait être facile de sortir des « one-liners » comme « break sur CreateFile si le fichier en cours d'ouverture est sur le bureau de l'utilisateur et que la fonction Blah est dans la pile. »
Soyons clairs : il m'a fallu environ 4 ans pour « apprivoiser » PowerShell. Je ressens qu'il a des angles vifs, des aspects qui sont simplement difficiles, et plein de bugs, tant dans la conception que dans l'implémentation. Parfois, cela m'irrite vraiment. Cependant, les avantages de PowerShell sont convaincants et m'ont convaincu que c'est la meilleure chose à utiliser pour ce projet :
Get-Command, la complétion par tabulation, la capacité d'exposer
des données hiérarchiques comme un système de fichiers, les facilités pour fournir et synthétiser de l'aide,
sont très bonnes.dt » pour « vider » un « objet », et obtenir
réellement un objet. DbgShell fait cela.cd » vers le système de fichiers, le registre, AD, etc. ;
vous pouvez exécuter Send-MailMessage, Get-WmiObject, Invoke-WebRequest,
Invoke-RestMethod, exécuter des programmes arbitraires, etc.DbgShell est en « mode prototypage » depuis longtemps. J'ai passé beaucoup de temps à déterminer comment quelque chose pourrait ou devrait être fait, mais pas nécessairement à « finir » tout. Il y a un nombre énorme de TODOs dans le code actuel. Bien qu'il ait commencé à devenir réellement utile, le projet est encore assez vert. Cependant, il peut certainement démontrer assez pour vous donner un bon aperçu de ce à quoi il devrait ressembler.
Voici quelques captures d'écran. Il est important de noter que rien de ce que vous voyez n'est un texte de sortie dbgeng.
Bien que certains éléments de la sortie vous sembleront familiers, c'est uniquement parce que j'ai
utilisé les fonctionnalités de formatage et de sortie de PowerShell pour personnaliser la façon dont certains objets sont
affichés—toute la sortie que vous voyez correspond en réalité à de véritables objets .NET complets. Par
exemple, ces messages ModLoad correspondent chacun à un objet MS.Dbg.ModuleLoadedEventArgs,
qui a plus de propriétés que celles affichées lorsqu'ils sont envoyés à Out-Default.
Il n'y a aucune analyse de chaîne de quoi que ce soit de dbgeng. (Enfin... presque. J'ai fait
quelques compromis là où il n'y a pas d'autre moyen d'obtenir des informations. Par exemple,
le désassemblage, ou l'analyse du nom symbolique d'une fonction d'ajusteur de thunk pour trouver le
décalage.)
Voici une sorte de scénario « hello world » : s'attacher à une instance de cmd.exe. J'utilise d'abord
la commande intégrée PowerShell Start-Process, puis je dirige la sortie vers la commande DbgShell
Connect-Process, et ensuite je me promène dans l'espace de noms :

Ici, je me suis attaché à un programme de test, j'ai regardé la pile, suis passé à un
frame de pile particulier, vidé les variables locales, inspecté la valeur d'un std::map local, et inspecté des informations
de type pour une valeur d'énumération locale. Notez l'affichage de la valeur d'énumération : non
seulement DbgShell gère la recherche du nom symbolique pour les énumérants simples, mais aussi
lorsque plusieurs énumérants sont combinés par OR. Vous ne pouvez pas le dire à partir de la capture d'écran, mais
il y a une complétion par tabulation pour tout cela.

!dbgshell » pour ouvrir une console
DbgShell.Sous licence MIT.
Ce projet accepte les contributions et les suggestions. La plupart des contributions nécessitent que vous acceptiez un Contrat de Licence de Contributeur (CLA) déclarant que vous avez le droit, et que vous nous accordez effectivement, les droits d'utiliser votre contribution. Pour plus de détails, visitez https://cla.microsoft.com.
Lorsque vous soumettez une pull request, un bot CLA déterminera automatiquement si vous devez fournir un CLA et décorera la PR en conséquence (par exemple, étiquette, commentaire). Suivez simplement les instructions fournies par le bot. Vous n'aurez besoin de faire cela qu'une seule fois pour tous les dépôts utilisant notre CLA.
Voir Contributing pour plus d'informations sur la contribution au projet.
Ce projet a adopté le Code de conduite Open Source Microsoft.
Pour plus d'informations, consultez la FAQ sur le Code de conduite ou contactez [email protected] pour toute question ou commentaire supplémentaire.
Vous pouvez trouver une courte introduction vidéo (3 minutes) ici : https://youtu.be/ynbg2zZ1Igc