SDK Helpers for Debugging
These functions and declarations are global helper functions for implementing debug engines, expression evaluators, and symbol providers in C++.
Note
There are no managed versions of these functions and declarations at this time.
Overview
In order for debug engines, expression evaluators, and symbol providers to be used by Visual Studio, they must be registered. This is done by setting registry subkeys and entries, otherwise known as "setting metrics." The following global functions are designed to ease the process of updating these metrics. See the section on Registry Locations to find out the layout of each registry subkey that is updated by these functions.
General Metric Functions
These are general functions used by debug engines. Specialized functions for expression evaluators and symbol providers are detailed later.
GetMetric Method
Retrieves a metric value from the registry.
HRESULT GetMetric(
LPCWSTR pszMachine,
LPCWSTR pszType,
REFGUID guidSection,
LPCWSTR pszMetric,
DWORD * pdwValue,
LPCWSTR pszAltRoot
);
Parameter |
Description |
---|---|
pszMachine |
[in] Name of a possibly remote machine whose register will be written (NULL means local machine). |
pszType |
[in] One of the metric types. |
guidSection |
[in] GUID of a specific engine, evaluator, exception, etc. This specifies a subsection under a metric type for a specific element. |
pszMetric |
[in] The metric to be obtained. This corresponds to a specific value name. |
pdwValue |
[in] The storage location of the value from the metric. There are several flavors of GetMetric that can return a DWORD (as in this example), a BSTR, a GUID, or an array of GUIDs. |
pszAltRoot |
[in] An alternate registry root to use. Set to NULL to use the default. |
SetMetric Method
Sets the specified metric value in the registry.
HRESULT SetMetric(
LPCWSTR pszType,
REFGUID guidSection,
LPCWSTR pszMetric,
const DWORD dwValue,
bool fUserSpecific,
LPCWSTR pszAltRoot
);
Parameter |
Description |
---|---|
pszType |
[in] One of the metric types. |
guidSection |
[in] GUID of a specific engine, evaluator, exception, etc. This specifies a subsection under a metric type for a specific element. |
pszMetric |
[in] The metric to be obtained. This corresponds to a specific value name. |
dwValue |
[in] The storage location of the value in the metric. There are several flavors of SetMetric that can store a DWORD (in this example), a BSTR, a GUID, or an array of GUIDs. |
fUserSpecific |
[in] TRUE if the metric is user-specific and if it should be written to the user's hive instead of the local machine hive. |
pszAltRoot |
[in] An alternate registry root to use. Set to NULL to use the default. |
RemoveMetric Method
Removes the specified metric from the registry.
HRESULT RemoveMetric(
LPCWSTR pszType,
REFGUID guidSection,
LPCWSTR pszMetric,
LPCWSTR pszAltRoot
);
Parameter |
Description |
---|---|
pszType |
[in] One of the metric types. |
guidSection |
[in] GUID of a specific engine, evaluator, exception, etc. This specifies a subsection under a metric type for a specific element. |
pszMetric |
[in] The metric to be removed. This corresponds to a specific value name. |
pszAltRoot |
[in] An alternate registry root to use. Set to NULL to use the default. |
EnumMetricSections Method
Enumerates the various metric sections in the registry.
HRESULT EnumMetricSections(
LPCWSTR pszMachine,
LPCWSTR pszType,
GUID * rgguidSections,
DWORD * pdwSize,
LPCWSTR pszAltRoot
);
Parameter |
Description |
---|---|
pszMachine |
[in] Name of a possibly remote machine whose register will be written (NULL means local machine). |
pszType |
[in] One of the metric types. |
rgguidSections |
[in, out] Preallocated array of GUIDs to be filled in. |
pdwSize |
[in] The maximum number of GUIDs that can be stored in the rgguidSections array. |
pszAltRoot |
[in] An alternate registry root to use. Set to NULL to use the default. |
Expression Evaluator Functions
Function |
Description |
---|---|
GetEEMetric |
Retrieves a metric value from the registry. |
SetEEMetric |
Sets the specified metric value in the registry. |
RemoveEEMetric |
Removes the specified metric from the registry. |
GetEEMetricFile |
Gets a file name from the specified metric and loads it, returning the file contents as a string. |
Exception Functions
Function |
Description |
---|---|
GetExceptionMetric |
Retrieves a metric value from the registry. |
SetExceptionMetric |
Sets the specified metric value in the registry. |
RemoveExceptionMetric |
Removes the specified metric from the registry. |
RemoveAllExceptionMetrics |
Removes all exception metrics from the registry. |
Symbol Provider Functions
Function |
Description |
---|---|
GetSPMetric |
Retrieves a metric value from the registry. |
SetSPMetric |
Sets the specified metric value in the registry. |
RemoveSPMetric |
Removes the specified metric from the registry. |
Enumeration Functions
Function |
Description |
---|---|
EnumMetricSections |
Enumerates all metrics for a specified metric type. |
EnumDebugEngine |
Enumerates the registered debug engines. |
EnumEEs |
Enumerates the registered expression evaluators. |
EnumExceptionMetrics |
Enumerates all exception metrics. |
Metric Definitions
These definitions can be used for predefined metric names. The names correspond to various registry keys and value names and are all defined as wide character strings: for example, extern LPCWSTR metrictypeEngine.
Predefined Metric Types |
Description: The base key for.... |
---|---|
metrictypeEngine |
All debug engine metrics. |
metrictypePortSupplier |
All port supplier metrics. |
metrictypeException |
All exception metrics. |
metricttypeEEExtension |
All expression evaluator extensions. |
Debug Engine Properties |
Description |
---|---|
metricAddressBP |
Set to nonzero to indicate support for address breakpoints. |
metricAlwaysLoadLocal |
Set to nonzero in order to always load the debug engine locally. |
metricLoadInDebuggeeSession |
NOT USED |
metricLoadedByDebuggee |
Set to nonzero to indicate that the debug engine will always be loaded with or by the program being debugged. |
metricAttach |
Set to nonzero to indicate support for attachment to existing programs. |
metricCallStackBP |
Set to nonzero to indicate support for call stack breakpoints. |
metricConditionalBP |
Set to nonzero to indicate support for the setting of conditional breakpoints. |
metricDataBP |
Set to nonzero to indicate support for the setting of breakpoints on changes in data. |
metricDisassembly |
Set to nonzero to indicate support for the production of a disassembly listing. |
metricDumpWriting |
Set to nonzero to indicate support for dump writing (the dumping of memory to an output device). |
metricENC |
Set to nonzero to indicate support for Edit and Continue.
Note
A custom debug engine should never set this or should always set it to 0.
|
metricExceptions |
Set to nonzero to indicate support for exceptions. |
metricFunctionBP |
Set to nonzero to indicate support for named breakpoints (breakpoints that break when a certain function name is called). |
metricHitCountBP |
Set to nonzero to indicate support for the setting of "hit point" breakpoints (breakpoints that are triggered only after being hit a certain number of times). |
metricJITDebug |
Set to nonzero to indicate support for just-in-time debugging (the debugger is launched when an exception occurs in a running process). |
metricMemory |
NOT USED |
metricPortSupplier |
Set this to the CLSID of the port supplier if one is implemented. |
metricRegisters |
NOT USED |
metricSetNextStatement |
Set to nonzero to indicate support for setting the next statement (which skips execution of intermediate statements). |
metricSuspendThread |
Set to nonzero to indicate support for suspending thread execution. |
metricWarnIfNoSymbols |
Set to nonzero to indicate that the user should be notified if there are no symbols. |
metricProgramProvider |
Set this to the CLSID of the program provider. |
metricAlwaysLoadProgramProviderLocal |
Set this to nonzero to indicate that the program provider should always be loaded locally. |
metricEngineCanWatchProcess |
Set this to nonzero to indicate that the debug engine will watch for process events instead of the program provider. |
metricRemoteDebugging |
Set this to nonzero to indicate support for remote debugging. |
metricEncUseNativeBuilder |
Set this to nonzero to indicate that the Edit and Continue Manager should use the debug engine's encbuild.dll to build for Edit and Continue.
Note
A custom debug engine should never set this or should always set it to 0.
|
metricLoadUnderWOW64 |
Set this to nonzero to indicate that the debug engine should be loaded in the debuggee process under WOW when debugging a 64-bit process; otherwise, the debug engine will be loaded in the Visual Studio process (which is running under WOW64). |
metricLoadProgramProviderUnderWOW64 |
Set this to nonzero to indicate that the program provider should be loaded in the debuggee process when debugging a 64-bit process under WOW; otherwise, it will be loaded in the Visual Studio process. |
metricStopOnExceptionCrossingManagedBoundary |
Set this to nonzero to indicate that the process should stop if an unhandled exception is thrown across managed/unmanaged code boundaries. |
metricAutoSelectPriority |
Set this to a priority for automatic selection of the debug engine (higher values equals higher priority). |
metricAutoSelectIncompatibleList |
Registry key containing entries that specify GUIDs for debug engines to be ignored in automatic selection. These entries are a number (0, 1, 2, and so on) with a GUID expressed as a string. |
metricIncompatibleList |
Registry key containing entries that specify GUIDs for debug engines that are incompatible with this debug engine. |
metricDisableJITOptimization |
Set this to nonzero to indicate that just-in-time optimizations (for managed code) should be disabled during debugging. |
Expression Evaluator Properties |
Description |
---|---|
metricEngine |
This holds the number of debug engines that support the specified expression evaluator. |
metricPreloadModules |
Set this to nonzero to indicate that modules should be preloaded when an expression evaluator is launched against a program. |
metricThisObjectName |
Set this to the "this" object name. |
Expression Evaluator Extension Properties |
Description |
---|---|
metricExtensionDll |
Name of the dll that supports this extension. |
metricExtensionRegistersSupported |
List of registers supported. |
metricExtensionRegistersEntryPoint |
Entry point for accessing registers. |
metricExtensionTypesSupported |
List of types supported. |
metricExtensionTypesEntryPoint |
Entry point for accessing types. |
Port Supplier Properties |
Description |
---|---|
metricPortPickerCLSID |
The CLSID of the port picker (a dialog box the user can use to select ports and add ports to use for debugging). |
metricDisallowUserEnteredPorts |
Nonzero if the user-entered ports cannot be added to the port supplier (this makes the port-picker dialog box essentially read-only). |
metricPidBase |
The base process ID used by the port supplier when allocating process IDs. |
Predefined SP Store Types |
Description |
---|---|
storetypeFile |
The symbols are stored in a separate file. |
storetypeMetadata |
The symbols are stored as metadata in an assembly. |
Miscellaneous Properties |
Description |
---|---|
metricShowNonUserCode |
Set this to nonzero to show nonuser code. |
metricJustMyCodeStepping |
Set this to nonzero to indicate that stepping can occur only in user code. |
metricCLSID |
CLSID for an object of a specific metric type. |
metricName |
User-friendly name for an object of a specific metric type. |
metricLanguage |
Language name. |
Registry Locations
The metrics are read from and written to the registry, specifically in the VisualStudio subkey.
Note
Most of the time, the metrics will be written to the HKEY_LOCAL_MACHINE key. However, sometimes HKEY_CURRENT_USER will be the destination key. Dbgmetric.lib handles both keys. When getting a metric, it searches HKEY_CURRENT_USER first, then HKEY_LOCAL_MACHINE. When it is setting a metric, a parameter specifies which top-level key to use.
[registry key]\
Software\
Microsoft\
VisualStudio\
[version root]\
[metric root]\
[metric type]\
[metric] = [metric value]
[metric] = [metric value]
[metric] = [metric value]
Placeholder |
Description |
---|---|
[registry key] |
HKEY_CURRENT_USER or HKEY_LOCAL_MACHINE. |
[version root] |
The version of Visual Studio (for example, 7.0, 7.1, or 8.0). However, this root can also be modified using the /rootsuffix switch to devenv.exe. For VSIP, this modifier is typically Exp, so the version root would be, for example, 8.0Exp. |
[metric root] |
This is either AD7Metrics or AD7Metrics(Debug), depending on whether the debug version of dbgmetric.lib is used.
Note
Whether or not dbgmetric.lib is used, this naming convention should be adhered to if you have differences between debug and release versions that must be reflected in the registry.
|
[metric type] |
The type of metric to be written: Engine, ExpressionEvaluator, SymbolProvider, etc. These are all defined as in dbgmetric.h as metricTypeXXXX, where XXXX is the specific type name. |
[metric] |
The name of an entry to be assigned a value in order to set the metric. The actual organization of the metrics depends on the metric type. |
[metric value] |
The value assigned to the metric. The type the value should have (string, number, etc.) depends on the metric. |
Note
All GUIDs are stored in the format of {GUID}. For example, {123D150B-FA18-461C-B218-45B3E4589F9B}.
Debug Engines
The following is the organization of the debug engines metrics in the registry. Engine is the metric type name for a debug engine and corresponds to [metric type] in the above registry subtree.
Engine\
[engine guid]\
CLSID = [class guid]
[metric] = [metric value]
[metric] = [metric value]
[metric] = [metric value]
PortSupplier\
0 = [port supplier guid]
1 = [port supplier guid]
Placeholder |
Description |
---|---|
[engine guid] |
The GUID of the debug engine. |
[class guid] |
The GUID of the class that implements this debug engine. |
[port supplier guid] |
The GUID of the port supplier, if any. Many debug engines use the default port supplier and therefore do not specify their own supplier. In this case, the subkey PortSupplier will be absent. |
Port Suppliers
The following is the organization of the port supplier metrics in the registry. PortSupplier is the metric type name for a port supplier and corresponds to [metric type].
PortSupplier\
[port supplier guid]\
CLSID = [class guid]
[metric] = [metric value]
[metric] = [metric value]
Placeholder |
Description |
---|---|
[port supplier guid] |
The GUID of the port supplier |
[class guid] |
The GUID of the class that implements this port supplier |
Symbol Providers
The following is the organization of the symbol supplier metrics in the registry. SymbolProvider is the metric type name for the symbol provider and corresponds to [metric type].
SymbolProvider\
[symbol provider guid]\
file\
CLSID = [class guid]
[metric] = [metric value]
[metric] = [metric value]
metadata\
CLSID = [class guid]
[metric] = [metric value]
[metric] = [metric value]
Placeholder |
Description |
---|---|
[symbol provider guid] |
The GUID of the symbol provider |
[class guid] |
The GUID of the class that implements this symbol provider |
Expression Evaluators
The following is the organization of the expression evaluator metrics in the registry. ExpressionEvaluator is the metric type name for the expression evaluator and corresponds to [metric type].
Note
The metric type for ExpressionEvaluator is not defined in dbgmetric.h, as it is assumed that all metric changes for expression evaluators will go through the appropriate expression evaluator metric functions (the layout of the ExpressionEvaluator subkey is somewhat complicated, so the details are hidden inside dbgmetric.lib).
ExpressionEvaluator\
[language guid]\
[vendor guid]\
CLSID = [class guid]
[metric] = [metric value]
[metric] = [metric value]
Engine\
0 = [debug engine guid]
1 = [debug engine guid]
Placeholder |
Description |
---|---|
[language guid] |
The GUID of a language |
[vendor guid] |
The GUID of a vendor |
[class guid] |
The GUID of the class that implements this expression evaluator |
[debug engine guid] |
The GUID of a debug engine that this expression evaluator works with |
Expression Evaluator Extensions
The following is the organization of the expression evaluator extension metrics in the registry. EEExtensions is the metric type name for the expression evaluator extensions and corresponds to [metric type].
EEExtensions\
[extension guid]\
[metric] = [metric value]
[metric] = [metric value]
Placeholder |
Description |
---|---|
[extension guid] |
The GUID of an expression evaluator extension |
Exceptions
The following is the organization of the exceptions metrics in the registry. Exception is the metric type name for the exceptions and corresponds to [metric type].
Exception\
[debug engine guid]\
[exception types]\
[exception]\
[metric] = [metric value]
[metric] = [metric value]
[exception]\
[metric] = [metric value]
[metric] = [metric value]
Placeholder |
Description |
---|---|
[debug engine guid] |
The GUID of a debug engine that supports exceptions. |
[exception types] |
A general title for the subkey identifying the class of exceptions that can be handled. Typical names are C++ Exceptions, Win32 Exceptions, Common Language Runtime Exceptions, and Native Run-Time Checks. These names are also used to identify a particular class of exception to the user. |
[exception] |
A name for an exception: for example, _com_error or Control-Break. These names are also used to identify a particular exception to the user. |
Requirements
These files are located in the Microsoft Visual Studio 2010 SDK installation directory (by default, [drive]\Program Files\Microsoft Visual Studio 2010 SDK\).
Header: includes\dbgmetric.h
Library: libs\ad2de.lib, libs\dbgmetric.lib