一个用于Windows调试器引擎的PowerShell前端。
准备好用Tab键快速导航了吗?快速入门请参阅入门指南。
本项目并非由Windows调试器团队制作、认可或监控。虽然调试器团队欢迎对其API和前端(windbg, kd等)的反馈,但他们与本项目无关。请不要针对本项目向调试器团队提交错误报告或反馈。
这不是一个受资助的项目:它没有官方分配的资源,仅由志愿者完成。除非您愿意完全自行支持该项目,否则请不要将任何生产依赖置于该项目之上。欢迎提交Issue和Pull Request,但请注意,由于志愿者资源有限,您的提交可能需要一段时间才能得到处理。
这是一个实验性项目:尚未完全成熟,您应预期会经常发生重大变更。
以上免责声明的推论:我建议不要将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”等。
我指的不仅仅是打开文本编辑器编写一些大型脚本来完成复杂操作——我也指的是在命令行上快速编写相对简单的内容。有很多情况下,你需要一些逻辑,但又不至于大到或可重复使用到需要保存它。应该很容易地编写出像“在CreateFile上设置断点,如果打开的文件在用户的桌面上并且函数Blah在堆栈上”这样的“一行代码”。
让我说清楚:我花了大约4年的时间才“接受”PowerShell。我觉得它有尖锐的边缘,有些方面就是很困难,并且在设计和实现上都有很多缺陷。有时它真的让我恼火。然而,PowerShell的好处是令人信服的,并且已经说服我它是这个项目的最佳选择:
Get-Command、Tab自动补全、像文件系统一样暴露分层数据的能力、提供和合成帮助的功能都非常好。dt”来“转储”一个“对象”,并实际得到一个对象。DbgShell做到了这一点。cd”到文件系统、注册表、AD等;你可以执行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组合的情况。从截图中看不出来,但所有这些都有Tab补全。

!dbgshell”打开一个DbgShell控制台。根据MIT许可证授权。
本项目欢迎贡献和建议。大多数贡献要求您同意一份贡献者许可协议(CLA),声明您有权并确实授予我们使用您的贡献的权利。详情请访问 https://cla.microsoft.com。
当您提交pull request时,一个CLA-bot将自动确定您是否需要提供CLA,并适当装饰PR(例如,标签、评论)。只需按照bot提供的说明操作。您只需在使用我们CLA的所有仓库中执行一次此操作。
有关贡献项目的更多信息,请参阅贡献。
本项目采用了Microsoft开源行为准则。
更多信息请参阅行为准则常见问题或联系[email protected]提出任何其他问题或意见。
您可以在这里找到简短的(3分钟)视频介绍:https://youtu.be/ynbg2zZ1Igc