如何以与调试器无关的方式从调试器扩展 (dbgeng) 读取用户输入?

How can I read user input from a debugger extension (dbgeng) in a debugger agnostic way?

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

我在调试器扩展中托管 PowerShell,并尝试实现对需要用户输入的读取主机的支持。

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

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

这将调用运行读取主机命令的 PowerShell。

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

是否有一种通用的方法来处理这个问题,它与正在加载扩展的调试器无关?

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

该方法的文档让您参考 "Using Input and Output"。该主题讨论 IDebugInputCallbacks。如果您还没有阅读该主题,建议您阅读。

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

我们最终编写了一个 PS 主机,它使用各种调试引擎 API 来完成 input/output。我们还在 Windbg 中为输入 window 挂钩了 WinProc,这样我们就可以进行制表符补全。这允许输入 PS 和 Windbg 命令并在输入 window 中完成制表符。两个命令集之间只有几个命令重叠。 ls 就是其中之一。所以我们有一个转义机制,比如命令开头的额外 space 来处理重叠。

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