Sample implementation of locals

Applies to: yesVisual Studio noVisual Studio for Mac

Note

This article applies to Visual Studio 2017. If you're looking for the latest Visual Studio documentation, see Visual Studio documentation. We recommend upgrading to the latest version of Visual Studio. Download it here

Important

In Visual Studio 2015, this way of implementing expression evaluators is deprecated. For information about implementing CLR expression evaluators, see CLR expression evaluators and Managed expression evaluator sample.

Following is an overview of how Visual Studio gets the locals for a method from the expression evaluator (EE):

  1. Visual Studio calls the debug engine's (DE) GetDebugProperty to get an IDebugProperty2 object that represents all the properties of the stack frame, including the locals.

  2. IDebugStackFrame2::GetDebugProperty calls GetMethodProperty to get an object that describes the method within which the breakpoint happened. The DE supplies a symbol provider (IDebugSymbolProvider), an address (IDebugAddress), and a binder (IDebugBinder).

  3. IDebugExpressionEvaluator::GetMethodProperty calls GetContainerField with the supplied IDebugAddress object to get an IDebugContainerField that represents the method containing the specified address.

  4. The IDebugContainerField interface is queried for the IDebugMethodField interface. It's this interface that gives access to the method's locals.

  5. IDebugExpressionEvaluator::GetMethodProperty instantiates a class (called CFieldProperty in the sample) that runs the IDebugProperty2 interface to represent the method's locals. The IDebugMethodField object is placed in this CFieldProperty object along with the IDebugSymbolProvider, IDebugAddress, and IDebugBinder objects.

  6. When the CFieldProperty object is initialized, GetInfo is called on the IDebugMethodField object to get a FIELD_INFO structure that contains all displayable information about the method itself.

  7. IDebugExpressionEvaluator::GetMethodProperty returns the CFieldProperty object as an IDebugProperty2 object.

  8. Visual Studio calls EnumChildren on the returned IDebugProperty2 object with the filter guidFilterLocalsPlusArgs, which returns an IEnumDebugPropertyInfo2 object containing the method's locals. This enumeration is filled in by calls to EnumLocals and EnumArguments.

  9. Visual Studio calls Next to obtain a DEBUG_PROPERTY_INFO structure for each local. This structure contains a pointer to an IDebugProperty2 interface for a local.

  10. Visual Studio calls GetPropertyInfo for each local to obtain the local's name, value, and type. This information is displayed in the Locals window.

In this section

Implement GetMethodProperty Describes an implementation of GetMethodProperty.

Enumerate locals Describes how the debug engine (DE) makes a call to enumerate local variables or arguments.

Get local properties Describes how the DE makes a call to get the name, type, and value of one or more locals.

Get local values Discusses getting the value of the local, which requires the services of a binder object given by the evaluation context.

Evaluate locals Explains how locals are evaluated.

Evaluation context Provides the arguments that are passed when the DE calls the expression evaluator (EE).

MyCEE sample Demonstrates one implementation approach to creating an expression evaluator for the MyC language.

See also