表达式评估器体系结构

重要

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

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

分析表达式

调试程序时,表达式会因多种原因被求值,但始终是在程序停在断点处时进行,不论是用户设置的断点还是异常引发的断点。 此时,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 时所需的关键接口以及计算上下文。