使用输入和输出

有关调试器引擎中的输入和输出流的概述,请参阅 输入和输出

输入

如果在客户端上调用 Input 方法,引擎将从其所有客户端请求 输入 。 输入将返回到 Input 的调用方。

输入回调

当引擎请求来自客户端的输入时,它将使用该客户端注册的 IDebugInputCallbacks 对象。 可以使用 SetInputCallbacks 向客户端注册 IDebugInputCallbacks 对象。 每个客户端最多可以有一个注册到它的 IDebugInputCallbacks 对象。

输入请求从调用 IDebugInputCallbacks::StartInput 方法的引擎开始。 这会通知 IDebugInputCallbacks 对象引擎正在等待输入。

如果 IDebugInputCallbacks 对象具有引擎的一些输入,则它可以调用任何客户端的 ReturnInput 方法。 调用 ReturnInput 方法后,引擎将不再接受任何输入。 此方法的后续调用方将收到未收到输入的通知。

然后,引擎将调用 IDebugInputCallbacks::EndInput 以指示它已停止等待输入。

最后,引擎将此输入回显到每个客户端 (的已注册 IDebugOutputCallbacks 对象,但用于提供输入) 的对象除外,该对象使用 IDebugOutputCallbacks::Output 并将位掩码设置为DEBUG_OUTPUT_PROMPT。

输出

可以使用多种客户端方法(例如 OutputOutputVaList)将输出发送到引擎。 收到输出后,引擎会将其发送到某些客户端。

客户端使用 输出掩码 来指示它们感兴趣的输出类型。 每当引擎生成输出时,它都附带一个指定其输出类型的掩码。 如果输出类型与客户端的输出掩码匹配,则客户端将收到输出。 可以通过调用 SetOutputMask 来设置输出掩码,并使用 GetOutputMask 进行查询。 有关输出掩码值的详细信息,请参阅 DEBUG_OUTPUT_XXX

引擎将向其发送输出的客户端列表由 输出控件控制。 通常,输出控件设置为将输出发送到所有客户端;但是,可以使用 ControlledOutput 和 ControlledOutputVaList 暂时更改它。 有关输出控件值的详细信息 ,请参阅 DEBUG_OUTCTL_XXX

输出可由引擎缓冲。 如果将多个输出片段传递给引擎,它可能会收集这些输出,并将其发送到一个大块中的客户端。 若要刷新此缓冲区,请使用 FlushCallbacks

每个客户端对象都有一个 输出宽度,即客户端对象的输出显示的宽度。 虽然此宽度仅用作提示,但某些命令和扩展函数会基于此宽度格式化其输出。 宽度由 GetOutputWidth 方法返回,可以使用 SetOutputWidth 方法设置。

输出回调

当引擎将输出发送到客户端时,它使用向客户端注册的 IDebugOutputCallbacks 对象。 可以使用 SetOutputCallbacks 向客户端注册 IDebugOutputCallbacks 对象。 每个客户端最多可以有一个注册到它的 IDebugInputCallbacks 对象。

为了发送输出,引擎调用 IDebugOutputCallbacks::Output 方法。

输出行前缀

每个客户端对象都有一个 输出行前缀 ,该前缀位于发送到与客户端对象关联的输出回调的每一行输出前面。 这可用于缩进或在每个输出行上放置标识标记。

输出行前缀由 GetOutputLinePrefix 返回,可以使用 SetOutputLinePrefix 进行设置。 若要暂时更改输出行前缀,稍后再次更改它,请使用 PushOutputLinePrefix 和 PopOutputLinePrefix。

日志文件

调试器引擎支持打开日志文件来记录调试会话。 一次最多可以打开一个日志文件。 发送到输出回调的输出也会发送到此日志文件 (,除非标记为未记录) 。

若要打开日志文件,请使用 OpenLogFile2 (或 OpenLogFile) 。 GetLogFile2 (或 GetLogFile) 方法返回当前打开的日志文件。 若要关闭日志文件,请使用 CloseLogFile

SetLogMask 方法可用于筛选发送到日志文件的输出,GetLogMask 将返回当前日志文件筛选器。

提示

在交互式调试会话中,可以使用提示向用户指示调试器正在等待用户输入。 使用 OutputPrompt 和OutputPromptVaList 方法将提示发送到输出回调。 标准提示的内容由 GetPromptText 返回。