如何以调试器不可知的方式从调试器扩展(dbgeng)读取用户输入?

时间:2016-01-14 20:26:11

标签: powershell windbg dbgeng

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

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

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

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

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

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

是否有一种通用方法可以处理与加载扩展的调试器不相关的问题?

1 个答案:

答案 0 :(得分:2)

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

该方法的文档引用“使用输入和输出”。该主题讨论了IDebugInputCallbacks。如果你还没有,建议你阅读这个主题。

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

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

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