
Ein PowerShell-Frontend für die Windows-Debugger-Engine.
Ein PowerShell-Frontend für die Windows-Debugger-Engine.
Bereit, sich per Tab durch die Glorie zu navigieren? Für eine schnellere Einführung werfen Sie einen Blick auf Getting Started.
Dieses Projekt wird nicht vom Windows-Debugger-Team erstellt, unterstützt oder überwacht. Das Debugger-Team freut sich über Feedback zu seiner API und den Frontends (windbg, kd usw.), hat jedoch keine Verbindung zu diesem Projekt. Reichen Sie keine Fehler oder Rückmeldungen zu diesem Projekt beim Debugger-Team ein.
Dies ist kein finanziertes Projekt: Es stehen keine offiziellen Ressourcen zur Verfügung, und es wird nur von Freiwilligen bearbeitet. Gehen Sie keine Produktionsabhängigkeit von diesem Projekt ein, es sei denn, Sie sind bereit, es vollständig selbst zu unterstützen. Sie können gerne Issues melden und Pull Requests einreichen, aber bedenken Sie, dass es aufgrund der begrenzten Freiwilligenressourcen eine Weile dauern kann, bis Ihre Einreichungen bearbeitet werden.
Dies ist ein experimentelles Projekt: Es ist nicht ausgereift, und Sie sollten mit häufigen bahnbrechenden Änderungen rechnen.
Konsequenz aus den obigen Haftungsausschlüssen: Ich würde davon abraten, DbgShell an live Ziele von hohem Wert anzuhängen.
https://aka.ms/dbgshell-latest
Haben Sie jemals versucht, etwas im Debugger zu automatisieren? (cdb/ntsd/kd/windbg) Wie ist das gelaufen?
Der Hauptantrieb für DbgShell ist, dass es einfach viel zu schwer ist, irgendetwas im Debugger zu automatisieren. Es gibt heute natürlich Einrichtungen, die bei der Automatisierung des Debuggers helfen. Aber meiner Meinung nach erfüllen sie die Bedürfnisse der Menschen nicht.
Das Ziel des DbgShell-Projekts ist es, die Vorzüge der objektbasierten PowerShell-Welt in die Debugging-Welt zu bringen. Wenn Sie 'dt' verwenden, um ein 'Objekt' auszugeben, sollten Sie ein tatsächliches Objekt erhalten. Scripting sollte so einfach sein wie das Schreiben eines PowerShell-Skripts.
Das DbgShell-Projekt bietet ein PowerShell-Frontend für dbgeng.dll, einschließlich:
Der benutzerdefinierte Host ist immer noch ein kommandozeilenbasiertes Programm (basierend auf conhost.exe) (analog zu ntsd/cdb/kd), kann aber von windbg aus aufgerufen werden (!DbgShell).
Neben der erheblichen Vereinfachung und Leistungssteigerung der Automatisierung wird es auch andere Anliegen angehen, wie die Benutzerfreundlichkeit für Personen, die die Debugger nicht so oft verwenden müssen. (eine Beschwerde, die ich gehört habe, ist: 'Wenn ich windbg verwenden muss, verbringe ich meine ganze Zeit in der .CHM')
Für erfahrene windbg-Benutzer ist ein weiteres Ziel, den Übergang so nahtlos wie möglich zu gestalten. So ist zum Beispiel der Namespace-Provider nicht der einzige Weg, auf Daten zuzugreifen; Sie können weiterhin traditionelle Befehle wie '~3 s', 'k' usw. verwenden.
Ich spreche nicht nur von der Art, wo man einen Texteditor öffnet und ein großes Skript schreibt, um etwas Komplexes zu tun – ich spreche auch davon, relativ einfache Dinge direkt auf der Kommandozeile aus dem Ärmel zu schütteln. Es gibt viele Situationen, in denen man ein bisschen Logik verwenden möchte, aber nichts so Großes oder Wiederverwendbares, dass man es speichern möchte. Es sollte einfach sein, 'Einzeiler' wie 'Halte bei CreateFile an, wenn die geöffnete Datei auf dem Desktop des Benutzers liegt und die Funktion Blah auf dem Stack ist', aus dem Handgelenk zu schütteln.
Lassen Sie mich klarstellen: Es hat ungefähr 4 Jahre gedauert, bis ich mich mit PowerShell 'angefreundet' habe. Ich finde, es hat Kanten, Aspekte, die einfach schwer sind, und viele Fehler, sowohl im Design als auch in der Implementierung. Manchmal nervt es mich wirklich. Trotzdem, die Vorteile von PowerShell sind überzeugend und haben mich davon überzeugt, dass es das Beste für dieses Projekt ist:
Get-Command, Tab-Vervollständigung, die Fähigkeit, hierarchische Daten wie ein Dateisystem darzustellen, die Möglichkeiten zur Bereitstellung und Synthese von Hilfe, sind sehr gut.dt', um ein 'Objekt' auszugeben, und erhalten tatsächlich ein Objekt. DbgShell macht das.cd' zum Dateisystem, zur Registrierung, zu AD usw. wechseln; Sie können Send-MailMessage, Get-WmiObject, Invoke-WebRequest, Invoke-RestMethod ausführen, beliebige Programme starten usw.DbgShell befindet sich seit langer Zeit im 'Prototyping-Modus'. Ich habe viel Zeit damit verbracht, herauszufinden, wie etwas gemacht werden könnte oder sollte, aber nicht unbedingt alles 'fertiggestellt'. Es gibt eine riesige Anzahl von TODOs im aktuellen Code. Obwohl es also angefangen hat, tatsächlich nützlich zu werden, ist das Projekt noch ziemlich grün. Es kann jedoch genug demonstrieren, um Ihnen einen guten Eindruck davon zu vermitteln, wie es sein soll.
Unten sind einige Screenshots. Es ist wichtig zu beachten, dass nichts, was Sie sehen, dbgeng-Textausgabe ist. Obwohl einige Dinge in der Ausgabe vertraut aussehen, liegt das nur daran, dass ich PowerShells Formatierungs- und Ausgabefunktionen verwendet habe, um die Darstellung bestimmter Objekte anzupassen – die gesamte Ausgabe, die Sie sehen, entspricht tatsächlich echten, vollwertigen .NET-Objekten. Zum Beispiel entsprechen diese ModLoad-Nachrichten jeweils einem MS.Dbg.ModuleLoadedEventArgs-Objekt, das mehr Eigenschaften hat als das, was bei der Ausgabe an Out-Default angezeigt wird. Es gibt keinerlei String-Parsing von irgendetwas aus dbgeng. (Naja... fast. Ich habe ein paar Kompromisse gemacht, wo es keinen anderen Weg gibt, an Informationen zu kommen. Zum Beispiel Disassembly-Sachen oder das Parsen des symbolischen Namens einer Adjustor-Thunk-Funktion, um den Offset zu finden.)
Dies ist eine Art 'Hallo Welt'-Szenario: Anhängen an eine Instanz von cmd.exe. Ich verwende zuerst den PowerShell-eingebauten Befehl Start-Process, leite die Ausgabe dann an den DbgShell-Befehl Connect-Process weiter und stöbere dann im Namespace herum:

Hier habe ich mich an ein Testprogramm angehängt, den Stack angesehen, zu einem bestimmten Stack-Frame gewechselt, Locals ausgegeben, den Wert einer lokalen std::map inspiziert und einige Typinformationen für einen lokalen Enum-Wert untersucht. Beachten Sie die Anzeige des Enum-Werts: DbgShell behandelt nicht nur das Nachschlagen des symbolischen Namens für einzelne Enumeratoren, sondern auch, wenn mehrere Enumeratoren mit ODER verknüpft sind. Das können Sie auf dem Screenshot nicht erkennen, aber es gibt Tab-Vervollständigung für all diese Dinge.

!dbgshell' aus, um eine DbgShell-Konsole zu öffnen.Lizenziert unter der MIT-Lizenz.
Dieses Projekt begrüßt Beiträge und Vorschläge. Die meisten Beiträge erfordern, dass Sie einer Contributor License Agreement (CLA) zustimmen, die besagt, dass Sie das Recht haben, uns die Rechte zur Nutzung Ihres Beitrags zu gewähren, und dies auch tun. Einzelheiten finden Sie unter https://cla.microsoft.com.
Wenn Sie einen Pull-Request einreichen, wird ein CLA-Bot automatisch feststellen, ob Sie eine CLA bereitstellen müssen, und den PR entsprechend dekorieren (z. B. Label, Kommentar). Befolgen Sie einfach die Anweisungen des Bots. Sie müssen dies nur einmal für alle Repos tun, die unsere CLA verwenden.
Weitere Informationen zum Mitwirken am Projekt finden Sie unter Contributing.
Dieses Projekt hat den Microsoft Open Source Code of Conduct übernommen.
Weitere Informationen finden Sie in den Code of Conduct FAQ oder wenden Sie sich bei weiteren Fragen oder Kommentaren an [email protected].
Sie finden eine kurze (3-minütige) Videoeinführung hier: https://youtu.be/ynbg2zZ1Igc