
Um front-end PowerShell para o mecanismo do depurador do Windows.
Um front-end PowerShell para o mecanismo de depuração do Windows.
Pronto para navegar com tab até a glória? Para uma introdução mais rápida, dê uma olhada em Começando.
Este projeto não é produzido, endossado ou monitorado pela equipe do depurador do Windows. Embora a equipe do depurador receba bem feedback sobre sua API e front-ends (windbg, kd et al), eles não têm conexão com este projeto. Não relate bugs ou feedback à equipe do depurador referentes a este projeto.
Este não é um projeto financiado: não possui recursos oficiais alocados a ele, e é trabalhado apenas por voluntários. Não assuma nenhuma dependência de produção neste projeto a menos que você esteja disposto a mantê-lo completamente por conta própria. Sinta-se à vontade para abrir Issues e enviar Pull Requests, mas entenda que, com os recursos voluntários limitados, pode levar algum tempo até que suas submissões sejam tratadas.
Este é um projeto experimental: não está totalmente amadurecido, e você deve esperar mudanças significativas frequentemente.
Corolário dos avisos acima: eu evitaria anexar o DbgShell a alvos vivos de alto valor.
https://aka.ms/dbgshell-latest
Você já tentou automatizar algo no depurador? (cdb/ntsd/kd/windbg) Como foi?
O principal ímpeto para o DbgShell é que é extremamente difícil automatizar qualquer coisa no depurador. Existem sim recursos hoje para ajudar na automatização do depurador, claro. Mas na minha opinião eles não estão atendendo às necessidades das pessoas.
O objetivo do projeto DbgShell é trazer a bondade do mundo orientado a objetos do PowerShell para o mundo da depuração. Quando você faz 'dt' para despejar um 'objeto', você deve obter um objeto real. Scripting deve ser tão fácil quanto escrever um script PowerShell.
O projeto DbgShell fornece um front-end PowerShell para dbgeng.dll, incluindo:
O host personalizado ainda é um programa baseado em linha de comando (conhost.exe) (análogo ao
ntsd/cdb/kd), mas pode ser invocado a partir do windbg (!DbgShell).
Além de tornar a automação muito mais fácil e poderosa, também abordará outras preocupações, como facilidade de uso para pessoas que não precisam usar os depuradores com tanta frequência. (uma reclamação que ouvi é que "quando acabo precisando usar windbg, passo todo o meu tempo no .CHM")
Para usuários experientes de windbg, por outro lado, outro objetivo é tornar a transição o mais
suave possível. Assim, por exemplo, o provedor de namespace não é a única maneira de
acessar dados; você ainda pode usar comandos tradicionais como "~3 s", "k", etc.
Não estou falando apenas do tipo de coisa em que você abre um editor de texto e escreve um grande script para fazer algo complexo — estou também falando de poder criar coisas relativamente simples diretamente na linha de comando. Há muitas situações em que você gostaria de poder usar um pouco de lógica, mas nada tão grande ou reutilizável que você queira sequer salvar. Deveria ser fácil criar "one-liners" como "parar em CreateFile se o arquivo que está sendo aberto estiver na área de trabalho do usuário e a função Blah estiver na pilha."
Deixe-me ser claro: levou aproximadamente 4 anos para eu "aquecer" o PowerShell. Acho que ele tem arestas, aspectos que são simplesmente difíceis e muitos bugs, tanto no design quanto na implementação. Às vezes ele realmente me irrita. No entanto, os benefícios do PowerShell são convincentes e me convenceram de que é a melhor coisa a usar para este projeto:
Get-Command, conclusão com tab, a capacidade de expor
dados hierárquicos como um sistema de arquivos, as facilidades para fornecer e sintetizar ajuda,
são muito boas.dt" para "despejar" um "objeto", e realmente
obter um objeto. O DbgShell faz isso.cd" para o sistema de arquivos, registro, AD, etc.;
você pode executar Send-MailMessage, Get-WmiObject, Invoke-WebRequest,
Invoke-RestMethod, executar programas arbitrários, etc.O DbgShell está em "modo de prototipação" há muito tempo. Passei muito tempo descobrindo como algo poderia ou deveria ser feito, mas não necessariamente "finalizando" tudo. Há um enorme número de TODOs no código atual. Portanto, embora tenha começado a se tornar realmente útil, o projeto ainda está bem verde. No entanto, pode definitivamente demonstrar o suficiente para lhe dar um bom gostinho de como deveria ser.
Abaixo estão algumas capturas de tela. É importante notar que nada que você vê é saída de texto do dbgeng.
Embora algumas coisas na saída pareçam familiares, isso é apenas porque usei
os recursos de formatação e saída do PowerShell para personalizar como certos objetos são
exibidos — toda a saída que você vê corresponde na verdade a objetos .NET reais e completos. Por
exemplo, essas mensagens ModLoad correspondem cada uma a um objeto
MS.Dbg.ModuleLoadedEventArgs, que tem mais propriedades do que as exibidas quando enviado para
Out-Default. Não há análise de string de nada do dbgeng. (Bem... quase. Fiz
algumas concessões onde não há outra maneira de obter informações. Por exemplo,
coisas de desmontagem, ou analisar o nome simbólico de uma função de ajuste de thunk para encontrar o
deslocamento.)
Este é um tipo de cenário "hello world": anexar a uma instância do cmd.exe. Primeiro uso
o comando embutido do PowerShell Start-Process, depois redireciono a saída para o comando do DbgShell
Connect-Process, e então exploro o namespace:

Aqui anexei a um programa de teste, e olhei a pilha, mudei para um quadro de pilha
específico, despejei variáveis locais, inspecionei o valor de um std::map local e inspecionei algumas informações
de tipo para um valor de enumeração local. Observe a exibição do valor de enumeração: não
apenas o DbgShell lida com a busca do nome simbólico para enumerandos individuais, mas também
quando múltiplos enumerandos são combinados com OR. Você não pode perceber isso pela captura de tela,
mas há conclusão com tab para todas essas coisas.

!dbgshell" para abrir um console
DbgShell.Licenciado sob a Licença MIT.
Este projeto aceita contribuições e sugestões. A maioria das contribuições exige que você concorde com um Contrato de Licença de Contribuidor (CLA) declarando que você tem o direito de, e realmente nos concede, os direitos de usar sua contribuição. Para detalhes, visite https://cla.microsoft.com.
Ao enviar um pull request, um bot de CLA determinará automaticamente se você precisa fornecer um CLA e decorará o PR apropriadamente (por exemplo, etiqueta, comentário). Basta seguir as instruções fornecidas pelo bot. Você só precisará fazer isso uma vez em todos os repositórios que usam nosso CLA.
Veja Contribuindo para mais informações sobre como contribuir com o projeto.
Este projeto adotou o Código de Conduta de Código Aberto da Microsoft.
Para mais informações, veja a FAQ do Código de Conduta ou entre em contato com [email protected] com quaisquer perguntas ou comentários adicionais.
Você pode encontrar uma breve introdução em vídeo (3 minutos) aqui: https://youtu.be/ynbg2zZ1Igc