
Un front-end PowerShell per il motore di debug di Windows.
Un front-end PowerShell per il motore di debug di Windows.
Pronto per tabulare verso la gloria? Per un'introduzione più rapida, dai un'occhiata a Primi passi.
Questo progetto non è prodotto, approvato o monitorato dal team di debug di Windows. Mentre il team di debug accoglie con favore feedback sulla loro API e sui front-end (windbg, kd, et al.), non hanno alcuna connessione con questo progetto. Non segnalare bug o feedback al team di debug riguardanti questo progetto.
Questo non è un progetto finanziato: non ha risorse ufficiali allocate, e viene sviluppato solo da volontari. Non assumere alcuna dipendenza produttiva da questo progetto a meno che tu non sia disposto a supportarlo completamente da solo. Sentiti libero di segnalare problemi e inviare richieste di pull, ma tieni presente che con le risorse volontarie limitate, potrebbe passare del tempo prima che le tue segnalazioni vengano gestite.
Questo è un progetto sperimentale: non è completamente maturo, e ci si devono aspettare modifiche sostanziali spesso.
Corollario delle avvertenze sopra: eviterei di collegare DbgShell a target live di alto valore.
https://aka.ms/dbgshell-latest
Hai mai provato ad automatizzare qualcosa nel debugger? (cdb/ntsd/kd/windbg) Come è andata?
La principale motivazione per DbgShell è che è davvero troppo difficile automatizzare qualsiasi cosa nel debugger. Ci sono delle strutture oggi per assistere nell'automazione del debugger, ovviamente. Ma a mio parere non stanno soddisfacendo le esigenze delle persone.
L'obiettivo del progetto DbgShell è portare la bontà del mondo PowerShell orientato agli oggetti nel mondo del debug. Quando fai 'dt' per scaricare un 'oggetto', dovresti ottenere un oggetto reale. Lo scripting dovrebbe essere facile come scrivere uno script PowerShell.
Il progetto DbgShell fornisce un front-end PowerShell per dbgeng.dll, includendo:
L'host personalizzato è ancora un programma a riga di comando (basato su conhost.exe) (analogo a
ntsd/cdb/kd), ma può essere invocato da windbg (!DbgShell).
Oltre a rendere l'automazione molto più semplice e potente, affronterà anche altre problematiche, come la facilità d'uso per le persone che non devono usare i debugger così spesso. (una lamentela che ho sentito è che "quando mi trovo a dover usare windbg, passo tutto il mio tempo nel .CHM")
Per gli utenti esperti di windbg, d'altra parte, un altro obiettivo è rendere la transizione il più
fluida possibile. Quindi, ad esempio, il provider di namespace non è l'unico modo per
accedere ai dati; puoi ancora usare comandi tradizionali come "~3 s", "k", ecc.
Non sto solo parlando del tipo di cosa in cui apri un editor di testo e scrivi un grosso script per fare qualcosa di complesso—sto anche parlando della capacità di sfornare roba relativamente semplice direttamente sulla riga di comando. Ci sono molte situazioni in cui vorresti poter usare un po' di logica, ma nulla di così grande o riutilizzabile da volerlo persino salvare. Dovrebbe essere facile sfornare semplici "one-liner" come "interrompi su CreateFile se il file in apertura è sul desktop dell'utente e la funzione Blah è sullo stack."
Chiariamoci: mi ci sono voluti circa 4 anni per "scaldarmi" con PowerShell. Penso che abbia spigoli vivi, aspetti che sono semplicemente difficili, e molti bug, sia nella progettazione che nell'implementazione. A volte mi irrita molto. Tuttavia, i benefici di PowerShell sono convincenti, e mi hanno convinto che è la cosa migliore da usare per questo progetto:
Get-Command, completamento tramite tab, la capacità di esporre
dati gerarchici come un filesystem, le strutture per fornire e sintetizzare aiuto, sono molto buone.dt" per "scaricare" un "oggetto", e ottenere
effettivamente un oggetto. DbgShell lo fa.cd" verso il filesystem, il registro, AD, ecc.;
puoi eseguire Send-MailMessage, Get-WmiObject, Invoke-WebRequest,
Invoke-RestMethod, eseguire programmi arbitrari, ecc.DbgShell è stato in "modalità prototipazione" per molto tempo. Ho passato molto tempo a capire come qualcosa potrebbe o dovrebbe essere fatto, ma non necessariamente "finendo" tutto. Ci sono un enorme numero di TODO nel codice attuale. Quindi anche se ha iniziato a diventare effettivamente utile, il progetto è ancora abbastanza acerbo. Tuttavia, può sicuramente dimostrare abbastanza da darti un buon assaggio di come dovrebbe essere.
Di seguito alcune schermate. È importante notare che nulla di ciò che vedi è output di testo di
dbgeng. Anche se alcune cose nell'output sembreranno familiari, è solo perché ho usato le
funzionalità di formattazione e output di PowerShell per personalizzare come vengono visualizzati
certi oggetti—tutto l'output che vedi corrisponde effettivamente a veri e propri oggetti .NET
completi. Ad esempio, quei messaggi ModLoad corrispondono ciascuno a un oggetto
MS.Dbg.ModuleLoadedEventArgs, che ha più proprietà di quelle visualizzate quando vengono inviati
a Out-Default. Non c'è alcun parsing di stringhe da dbgeng. (Beh... quasi. Ho fatto alcune
concessioni dove non c'è altro modo per ottenere informazioni. Ad esempio, cose di disassemblaggio,
o l'analisi del nome simbolico di una funzione di thunk adjustor per trovare l'offset.)
Questo è una sorta di scenario "hello world": collegamento a un'istanza di cmd.exe. Uso prima
il comando PowerShell integrato Start-Process, quindi invio l'output al comando DbgShell
Connect-Process, e poi giro intorno al namespace:

Qui mi sono collegato a un programma di test, e ho guardato lo stack, sono passato a un frame
particolare dello stack, ho scaricato le variabili locali, ispezionato il valore di una
std::map locale, e ispezionato alcune informazioni di tipo per un valore enum locale. Notare
la visualizzazione del valore dell'enumerazione: non solo DbgShell gestisce la ricerca del nome
simbolico per singoli enumerandi, ma anche quando più enumerandi sono ORed insieme. Non puoi
dirlo dallo screenshot, ma c'è il completamento tramite tab per tutta questa roba.

!dbgshell" per aprire una console DbgShell.Concesso in licenza sotto la MIT License.
Questo progetto accoglie contributi e suggerimenti. La maggior parte dei contributi richiede che tu accetti un Contributor License Agreement (CLA) che dichiari che hai il diritto di concederci effettivamente i diritti per utilizzare il tuo contributo. Per dettagli, visita https://cla.microsoft.com.
Quando invii una pull request, un CLA-bot determinerà automaticamente se hai bisogno di fornire un CLA e decorerà la PR in modo appropriato (ad esempio, etichetta, commento). Segui semplicemente le istruzioni fornite dal bot. Dovrai farlo solo una volta per tutti i repository che utilizzano il nostro CLA.
Vedi Contributing per maggiori informazioni su come contribuire al progetto.
Questo progetto ha adottato il Microsoft Open Source Code of Conduct.
Per maggiori informazioni, consulta il Code of Conduct FAQ o contatta [email protected] per ulteriori domande o commenti.
Puoi trovare una breve introduzione video (3 minuti) qui: https://youtu.be/ynbg2zZ1Igc