1

我正在编写一个调试器扩展,并且正在寻找一种在扩展开始执行后从调试器扩展获取用户输入的方法。

我在调试器扩展中托管 PowerShell,并尝试实现对需要用户输入的 Read-Host 的支持。

例如,在调试器中,我可以在 PSExt_profile.ps1 中编写一个脚本: function Foo{ Read-Host -Prompt "Enter your address" }

并在调试器命令行上: !ps Foo

这将调用运行 Read-Host 命令的 PowerShell。

我不明白如何从扩展中询问从 WinDbg 获取输入。在 cdb 中,我可以使用控制台功能。

有没有一种通用的方法来处理这个与加载扩展的调试器无关的问题?

4

1 回答 1

2

大约 5 年前,我编写了一个托管 PS 的调试器扩展。它是专门为 Windbg 设计的,因为已经有针对 KD 和 CDB 的解决方案(我认为他们只是将 stdin 和 stdout 重定向到驱动程序 PS 脚本中)。由于代码归我工作的公司所有,我通过查看 API 来回答。我看到 IDebugControl4::InputWide 是一种输入法。

该方法的文档将您引向“使用输入和输出”。该主题谈论 IDebugInputCallbacks。如果您还没有,建议您阅读该主题。

这些 API 在调试引擎中,因此在使用该引擎的所有调试器中应该是通用的。

我们最终编写了一个使用各种调试引擎 API 进行输入/输出的 PS 主机。我们还为 Windbg 中的输入窗口连接了 WinProc,以便我们可以完成选项卡。这允许在输入窗口中输入 PS 和 Windbg 命令并完成选项卡。两个命令集之间只有几个命令重叠。ls是其中之一。所以我们有一个转义机制,比如命令开头的额外空格,来处理重叠。

顺便说一句,如果你有兴趣在这方面合作,请告诉我。我在公司的角色在我们有了 alpha-ish 级别的代码后不久就发生了变化,所以从来没有真正看到这一点。我一直想回到它(并让我的公司开源它),但没有。

于 2016-01-14T20:45:17.077 回答