
Windows 디버거 엔진을 위한 PowerShell 프론트엔드입니다.
Windows 디버거 엔진을 위한 PowerShell 프론트엔드.
탭으로 멋지게 이동할 준비가 되셨나요? 빠른 소개는 Getting Started를 참조하세요.
이 프로젝트는 Windows 디버거 팀에서 제작, 보증 또는 모니터링하지 않습니다. 디버거 팀은 자체 API 및 프론트엔드(windbg, kd 등)에 대한 피드백을 환영하지만, 이 프로젝트와는 아무런 관련이 없습니다. 이 프로젝트에 관한 버그나 피드백을 디버거 팀에 제출하지 마십시오.
이 프로젝트는 자금 지원을 받지 않습니다: 공식적으로 할당된 리소스가 없으며, 오직 자원봉사자에 의해 작업됩니다. 스스로 완전히 지원할 의사가 없는 한 이 프로젝트에 대한 프로덕션 의존성을 갖지 마십시오. 이슈를 제출하고 풀 리퀘스트를 보내는 것은 자유지만, 제한된 자원봉사자로 인해 처리가 다소 시간이 걸릴 수 있음을 이해해 주십시오.
이는 실험적인 프로젝트입니다: 완전히 완성되지 않았으며, 자주 호환성을 깨는 변경이 있을 수 있습니다.
위 면책 사항의 귀결: 중요한 라이브 대상에 DbgShell을 연결하는 것은 피하는 것이 좋습니다.
https://aka.ms/dbgshell-latest
디버거(cdb/ntsd/kd/windbg)에서 무언가를 자동화하려고 시도한 적이 있나요? 결과가 어땠나요?
DbgShell의 주요 동기는 디버거에서 무언가를 자동화하는 것이 너무 어렵다는 점입니다. 물론 현재 디버거 자동화를 지원하는 기능이 있습니다. 하지만 제 생각에는 그것들이 사람들의 요구를 충족시키지 못하고 있습니다.
DbgShell 프로젝트의 목표는 객체 기반 PowerShell 세계의 장점을 디버깅 세계로 가져오는 것입니다. 'dt'를 사용하여 '객체'를 덤프하면 실제 객체를 얻을 수 있어야 합니다. 스크립팅은 PowerShell 스크립트를 작성하는 것만큼 쉬워야 합니다.
DbgShell 프로젝트는 dbgeng.dll을 위한 PowerShell 프론트엔드를 제공합니다, 포함:
사용자 지정 호스트는 여전히 명령줄(conhost.exe 기반) 프로그램입니다(ntsd/cdb/kd와 유사), 하지만 windbg(!DbgShell)에서 호출할 수 있습니다.
자동화를 훨씬 더 쉽고 강력하게 만드는 것 외에도, 디버거를 자주 사용하지 않는 사람들을 위한 사용 편의성과 같은 다른 문제도 해결할 것입니다. (들어본 불만 중 하나는 "windbg를 사용해야 할 때 모든 시간을 .CHM에서 보낸다"는 것입니다.)
반면에 노련한 windbg 사용자에게는 전환을 가능한 한 매끄럽게 만드는 것이 또 다른 목표입니다. 예를 들어, 네임스페이스 공급자가 데이터에 접근하는 유일한 방법은 아닙니다. "~3 s", "k" 등과 같은 전통적인 명령을 계속 사용할 수 있습니다.
텍스트 편집기를 열고 복잡한 작업을 수행하는 큰 스크립트를 작성하는 종류만을 말하는 것이 아닙니다—명령줄에서 직접 비교적 간단한 작업을 즉시 수행할 수 있는 것도 말하는 것입니다. 약간의 논리를 사용하고 싶지만 저장할 정도로 크거나 재사용 가능하지 않은 상황이 많습니다. "열려는 파일이 사용자 바탕 화면에 있고 함수 Blah가 스택에 있을 때 CreateFile에서 중단"과 같은 "원라이너"를 쉽게 작성할 수 있어야 합니다.
분명히 말씀드리자면: PowerShell에 "익숙해지는" 데 약 4년이 걸렸습니다. 날카로운 모서리, 단순히 어려운 측면, 설계 및 구현 모두에서 많은 버그가 있다고 생각합니다. 때로는 정말 짜증납니다. 하지만 PowerShell의 이점은 매력적이며, 이 프로젝트에 사용하기에 가장 좋은 것이라고 확신하게 되었습니다:
Get-Command, 탭 완성, 파일 시스템처럼 계층적 데이터를 노출하는 기능, 도움말 제공 및 합성 기능이 매우 좋습니다.dt"를 사용하여 "객체"를 "덤프"하고 실제로 객체를 얻는 것을 상상해보세요. DbgShell이 그렇게 합니다.cd"할 수 있습니다. Send-MailMessage, Get-WmiObject, Invoke-WebRequest, Invoke-RestMethod를 실행하고 임의의 프로그램을 실행할 수 있습니다.DbgShell은 오랫동안 "프로토타입 모드"에 있었습니다. 무엇인가를 어떻게 또는 어떻게 해야 하는지 파악하는 데 많은 시간을 보냈지만, 모든 것을 "완료"하지는 않았습니다. 현재 코드에는 엄청난 수의 TODO가 있습니다. 따라서 실제로 유용해지기 시작했지만 프로젝트는 아직 많이 미성숙합니다. 하지만 어떤 모습일지 충분히 맛볼 수 있을 만큼은 확실히 보여줄 수 있습니다.
아래는 몇 가지 스크린샷입니다. 보이는 모든 것이 dbgeng 텍스트 출력이 아니라는 점에 유의하는 것이 중요합니다. 출력의 일부는 익숙해 보이겠지만, 이는 PowerShell의 서식 및 출력 기능을 사용하여 특정 객체가 표시되는 방식을 사용자 지정했기 때문입니다—보이는 모든 출력은 실제로 실제 완전한 .NET 객체에 해당합니다. 예를 들어, ModLoad 메시지는 각각 MS.Dbg.ModuleLoadedEventArgs 객체에 해당하며, 이 객체는 Out-Default로 보낼 때 표시되는 것보다 더 많은 속성을 가지고 있습니다. dbgeng의 어떤 문자열도 파싱하지 않습니다. (음... 거의 그렇습니다. 정보를 얻을 다른 방법이 없는 몇 가지 절충을 했습니다. 예를 들어, 디스어셈블리 또는 adjustor thunk 함수의 기호 이름을 파싱하여 오프셋을 찾는 것 등입니다.)
일종의 "hello world" 시나리오입니다: cmd.exe 인스턴스에 연결하는 것. 먼저 PowerShell 내장 명령 Start-Process를 사용한 다음, 출력을 DbgShell 명령 Connect-Process로 파이프하고, 네임스페이스를 탐색합니다:

여기서는 테스트 프로그램에 연결하고, 스택을 살펴보고, 특정 스택 프레임으로 전환하고, 지역 변수를 덤프하고, 지역 std::map의 값을 검사하고, 지역 열거형 값의 일부 형식 정보를 검사했습니다. 열거형 값 표시에 주목하세요: DbgShell은 단일 열거자의 기호 이름을 조회할 뿐만 아니라 여러 열거자가 OR로 결합된 경우도 처리합니다. 스크린샷에서는 알 수 없지만, 이 모든 것에 탭 완성이 있습니다.

!dbgshell"을 실행하여 DbgShell 콘솔을 열면 됩니다.MIT 라이선스에 따라 라이선스가 부여됩니다.
이 프로젝트는 기여와 제안을 환영합니다. 대부분의 기여는 귀하가 기여를 사용할 권리가 있으며 실제로 그렇게 한다는 것을 선언하는 기여자 라이선스 계약(CLA)에 동의해야 합니다. 자세한 내용은 https://cla.microsoft.com을 방문하십시오.
풀 리퀘스트를 제출하면 CLA-bot이 자동으로 CLA를 제공해야 하는지 여부를 결정하고 PR에 적절히 레이블/댓글을 추가합니다. 봇이 제공하는 지침을 따르기만 하면 됩니다. CLA를 사용하는 모든 리포지토리에서 이 작업을 한 번만 수행하면 됩니다.
프로젝트 기여에 대한 자세한 내용은 Contributing을 참조하십시오.
이 프로젝트는 Microsoft Open Source Code of Conduct를 채택했습니다.
자세한 내용은 Code of Conduct FAQ를 참조하거나 추가 질문이나 의견이 있으면 [email protected]으로 문의하십시오.
짧은 (3분) 동영상 소개는 여기에서 찾을 수 있습니다: https://youtu.be/ynbg2zZ1Igc