表达式计算器体系结构

重要

在 Visual Studio 2015 中,这种实现表达式计算器的方法已弃用。 有关实现 CLR 表达式计算器的信息,请参阅 CLR 表达式计算器托管表达式计算器示例

将专有语言集成到 Visual Studio 调试包意味着必须设置所需的表达式计算器 (EE) 接口,并调用公共语言运行时符号提供程序 (SP) 和联编程序接口。 SP 和联编程序对象,以及当前执行地址是计算表达式的上下文。 这些接口生成与使用的信息表示企业版体系结构中的关键概念。

分析表达式

在调试程序时,会出于多种原因计算表达式,但始终在被调试的程序在断点处停止的时候(由用户放置断点或由异常引起的断点)。 此时,Visual Studio 从调试引擎 (DE) 获取由 IDebugStackFrame2 接口表示的堆栈帧。 然后,Visual Studio 调用 GetExpressionContext,以获取 IDebugExpressionContext2 接口。 此接口表示可计算表达式的上下文;ParseText 是计算过程的入口点。 到目前为止,所有接口均由 DE 实现。

调用 IDebugExpressionContext2::ParseText 时,当被调用时,DE 会实例化与发生断点的源文件的语言相关联的 EE(此时 DE 也会实例化 SH)。 EE 由 IDebugExpressionEvaluator 接口表示。 然后,DE 调用 Parse,将表达式(以文本形式形式)转换为已分析的表达式,以便进行计算。 此分析的表达式由 IDebugParsedExpression 接口表示。 此时表达式通常经过分析,但未经过计算。

DE 创建一个实现 IDebugExpression2 接口的对象,将 IDebugParsedExpression 对象放入 IDebugExpression2 对象中,并从 IDebugExpression2 返回 IDebugExpressionContext2::ParseText 对象。

计算表达式

Visual Studio 调用 EvaluateSyncEvaluateAsync 以计算分析的表达式。 这两种方法都调用 EvaluateSyncIDebugExpression2::EvaluateSync 立即调用该方法,同时 IDebugExpression2::EvaluateAsync 通过后台线程调用该方法),以计算分析的表达式并返回一个 IDebugProperty2 接口来表示已分析表达式的值和类型。 IDebugParsedExpression::EvaluateSync 使用提供的 SH、地址和联编程序将分析的表达式转换为由 IDebugProperty2 接口表示的实际值。

例如

在正在运行的程序中命中断点后,用户选择在“快速监视”对话框中查看变量。 此对话框显示变量的名称、值及类型。 用户通常可以更改该值。

显示“快速监视”对话框时,要检查的变量的名称将作为文本发送到 ParseText。 这将返回一个 IDebugExpression2 对象,以表示分析的表达式,在本例中为变量。 然后调用 EvaluateSync 以生成一个 IDebugProperty2 对象,以表示变量的值和类型及其名称。 显示的就是这些信息。

如果用户更改变量的值,则使用新值调用 SetValueAsString,这会更改内存中变量的值,以便在程序恢复运行时使用。

有关显示变量值的此过程的更多详细信息,请参阅显示局部变量。 有关变量值更改方式的更多详细信息,请参阅更改局部变量的值

本节内容

计算上下文提供在 DE 调用 EE 时传递的参数。

关键表达式求值器接口描述编写 EE 以及计算上下文时所需的关键接口。