与引擎交互

命令和表达式

调试器引擎 API 提供执行命令和计算表达式的方法,如在 WinDbg 的 调试器命令窗口中键入的方法。 若要执行调试器命令,请使用 Execute。 或者,若要执行文件中的所有命令,请使用 ExecuteCommandFile

方法 Evaluate 将使用 C++ 或 MASM 语法计算表达式。 调试器引擎用于计算表达式的语法(例如在 Evaluate 方法中)由 GetExpressionSyntax 提供,可以使用 SetExpressionSyntaxByNameSetExpressionSyntax 进行更改。 调试器识别的不同语法的数目由 GetNumberExpressionSyntaxes 返回,其名称由 GetExpressionSyntaxNames 返回。

Evaluate 返回的值的类型由计算的字符串中使用的符号和常量决定。 该值包含在 DEBUG_VALUE 结构中,可以使用 CoerceValueCoerceValues 强制转换为不同的类型。

别名

别名 是在调试器命令和表达式中使用时自动替换为其他字符串的字符串。 有关别名的概述,请参阅 使用别名。 调试器引擎具有多个别名类。

固定名称别名按数字编制索引,其名称$u 0$u 1、...$u 9。 可以使用 SetTextMacro 方法设置这些别名的值,并使用 GetTextMacro 方法检索这些别名的值。

自动别名用户命名别名可以具有任何名称。 自动别名由调试器引擎定义,用户命名别名由用户通过调试器命令或调试器引擎 API 定义。 若要定义或删除用户命名别名,请使用 SetTextReplacement 方法。 GetTextReplacement 方法返回自动别名或用户命名别名的名称和值。 可以使用 RemoveTextReplacements 方法删除所有用户命名的别名。 GetNumberTextReplacements 方法将返回用户名和自动别名的数目;这可以与 GetTextReplacement 一起使用,以循环访问所有这些别名。 OutputTextReplacements 方法将打印所有用户命名别名的列表,包括其名称和值。

请注意 ,如果用户命名的别名与自动别名同名,则用户命名别名将隐藏自动别名,以便在按名称检索别名的值时,将使用用户命名的别名。

>引擎选项

引擎具有许多用于控制其行为的选项。 DEBUG_ENGOPT_XXX中列出了这些选项。 它们由 GetEngineOptions 返回,可以使用 SetEngineOptions 进行设置。 可以使用 AddEngineOptions 设置单个选项,使用 RemoveEngineOptions 取消设置。

中断

中断是强制中断调试器或告知引擎停止处理当前命令的一种方法,例如,在 WinDbg 中按 Ctrl+Break。

若要请求中断调试器或中断调试器的当前任务,请使用 SetInterrupt。 若要检查是否存在中断,请使用 GetInterrupt

注意从调试器扩展执行长任务时,建议扩展定期检查 GetInterrupt,并在请求中断时停止处理。

请求中断调试器时,如果目标执行中断所需的时间过长,引擎可能会超时。 如果目标处于无响应状态,或者资源争用阻止或延迟了闯入请求,则可能会发生这种情况。 引擎等待的时间长度由 GetInterruptTimeout 返回,可以使用 SetInterruptTimeout 设置。