Información general sobre el modelo de datos del depurador de C++

En este tema se proporciona información general sobre cómo usar interfaces de C++ del modelo de datos del depurador para ampliar y personalizar las funcionalidades del depurador.

Este tema forma parte de una serie que describe las interfaces accesibles desde C++, cómo usarlas para crear una extensión de depurador basada en C++ y cómo usar otras construcciones de modelo de datos (por ejemplo: JavaScript o NatVis) desde una extensión de modelo de datos de C++.

Información general sobre el modelo de datos del depurador de C++

Interfaces de C++ del modelo de datos del depurador

Objetos C++ del modelo de datos del depurador

Interfaces adicionales del modelo de datos del depurador de C++

Conceptos de C++ del modelo de datos del depurador

Scripting del modelo de datos del depurador de C++


Información general de la interfaz C++ del modelo de datos del depurador

El modelo de datos del depurador es un modelo de objeto extensible fundamental para la forma en que las nuevas extensiones del depurador (incluidas las de JavaScript, NatVis y C++) consumen información desde el depurador y producen información a la que se puede obtener acceso desde el depurador así como otras extensiones. Las construcciones escritas en las API del modelo de datos están disponibles en el evaluador de expresiones más recientes (dx) del depurador, así como en las extensiones de JavaScript o en las extensiones de C++.

Para ilustrar los objetivos del modelo de datos del depurador, tenga en cuenta este comando tradicional del depurador.

0: kd> !process 0 0 
PROCESS ffffe0007e6a7780
    SessionId: 1  Cid: 0f68    Peb: 7ff7cfe7a000  ParentCid: 0f34
    DirBase: 1f7fb9000  ObjectTable: ffffc001cec82780  HandleCount:  34.
    Image: echoapp.exe
...

El comando del depurador usa una máscara binaria y proporciona solo texto de maneras no estándar. La salida de texto es difícil de consumir, dar formato o extender y el diseño es específico de este comando.

Compare esto con el comando dx (Display Debugger Object Model Expression) del modelo de datos del depurador.

dx @$cursession.Processes.Where(p => p.Threads.Count() > 5)

Este comando usa un modelo de datos estándar que es reconocible, extensible y composable de maneras uniformes.

El espaciado lógico de los elementos y la extensión en objetos específicos permite la detección de la funcionalidad de extensión del depurador.

Sugerencia

Dado que las interfaces de objetos C++ del modelo de datos pueden ser muy detalladas para implementar una biblioteca auxiliar completa de C++ para el modelo de datos que usa un paradigma completo de programación de plantillas y excepciones de C++. Para obtener más información, vea Usar la biblioteca DbgModelClientEx más adelante en este tema.

El modelo de datos es la forma en que WinDbg muestra la mayoría de las cosas. Muchos elementos de la nueva interfaz de usuario se pueden consultar, ampliar o crear scripts, ya que están alimentados por el modelo de datos. Para obtener más información, vea WinDbg - Data Model.

Captura de pantalla de la ventana de exploración del modelo de datos que muestra el proceso y los subprocesos.

Vista de arquitectura del modelo de datos

En el diagrama siguiente se resumen los elementos principales de la arquitectura del modelo de datos del depurador.

  • A la izquierda, se muestran elementos de interfaz de usuario que proporcionan acceso a los objetos y admiten dicha funcionalidad como consultas LINQ.
  • En el lado derecho del diagrama se muestran componentes que proporcionan datos al modelo de datos del depurador. Esto incluye extensiones personalizadas del modelo de datos natVis, JavaScript y C++.

Diagrama que muestra la arquitectura del modelo de datos con el modelo de objetos común en el centro y los proveedores de la derecha.

Modelo de objetos

En el centro del modelo de datos del depurador es una representación uniforme de objetos en la que todo es una instancia de la interfaz IModelObject. Aunque este tipo de objeto puede representar un intrínseco (por ejemplo, un valor entero) u otra interfaz de modelo de datos, a menudo representa un objeto dinámico: un diccionario de tuplas clave/valor/metadatos y un conjunto de conceptos que describen comportamientos abstractos.

En este diagrama se muestra cómo IModelObject usa almacenes de claves para contener valores que un proveedor puede crear, registrar y manipular.

  • Muestra un proveedor, que proporciona información al modelo de objetos.
  • A la izquierda se muestra el IModelObject, que es el modelo de objetos común que se usa para manipular objetos.
  • En el centro se encuentra el almacén de claves que se usa para almacenar y acceder a los valores.
  • En la parte inferior se muestran conceptos que admiten objetos con funcionalidad como la capacidad de convertir en una cadena que se puede mostrar o se indexan.

Diagrama que muestra la arquitectura del modelo de datos con IModelObject como entrada y un almacén de claves de tuplas.

El modelo de datos: una vista de consumidor

En el diagrama siguiente se muestra una vista de consumidor del modelo de datos. En el ejemplo, se usa el comando dx (Display Debugger Object Model Expression) para consultar información.

  • El comando Dx se comunica a través de un serializador a la interfaz de enumeración de objetos.
  • Los objetos IDebugHost* se usan para recopilar información del motor del depurador.
  • Los evaluadores de expresiones y semánticos se usan para enviar la solicitud al motor del depurador.

Diagrama que muestra la arquitectura del modelo de datos con la interfaz de usuario que incluye evaluadores que se conectan a IDebugHost.

El modelo de datos: una vista productor

En este diagrama se muestra una vista de productor del modelo de datos.

  • Se muestra un proveedor NatVis a la izquierda que consume XML que define funcionalidad adicional.
  • Un proveedor de JavaScript puede aprovechar los conceptos del proveedor dinámico para manipular información en tiempo real.
  • En la parte inferior se muestra un proveedor de código nativo que también puede definir funcionalidad adicional.

Diagrama que muestra la arquitectura del modelo de datos con IModelObject conectado a natVis, JavaScript y consumidores de código nativo.

Administrador de modelos de datos

En este diagrama se muestra el rol central que desempeña el administrador de modelos de datos en la administración de objetos.

  • Data Model Manager actúa como registrador central para todos los objetos.
  • A la izquierda se muestra cómo se registran los elementos del depurador estándar, como las sesiones y el proceso.
  • El bloque de espacio de nombres muestra la lista de registro central.
  • En el lado derecho del diagrama se muestran dos proveedores, uno para NatVis en la parte superior y una extensión de C/C++ en la parte inferior.

Diagrama que muestra la arquitectura del modelo de datos con los nombres registrados a los que accede el administrador de modelos de datos.

Resumen de las interfaces del modelo de datos del depurador

Hay una multitud de interfaces de C++ que componen diferentes partes del modelo de datos. Para abordar estas interfaces de una manera coherente y sencilla, se desglosan por categoría general. Las áreas principales aquí:

El modelo de objetos general

El primer y el conjunto más importante de interfaces definen cómo obtener acceso al modelo de datos principal y cómo acceder y manipular objetos. IModelObject es la interfaz que representa todos los objetos del modelo de datos (al igual que el objeto de C#). Esta es la interfaz principal de interés tanto para los consumidores de como para los productores del modelo de datos. Las otras interfaces son mecanismos para acceder a distintos aspectos de los objetos. Las interfaces siguientes se definen para esta categoría:

Puentes entre DbgEng y el modelo de datos

IHostDataModelAccess

Interfaces principales

IModelObject

IKeyStore

IModelIterator

IModelPropertyAccessor

IModelMethod

IKeyEnumerator

IRawEnumerator

IModelKeyReference / IModelKeyReference2

Interfaces de concepto

IStringDisplayableConcept

IIterableConcept

IIndexableConcept

IPreferredRuntimeTypeConcept

IDataModelConcept

IDynamicKeyProviderConcept

IDynamicConceptProviderConcept

Administración de modelos de datos y extensibilidad

Data Model Manager es el componente principal que administra cómo se produce toda extensibilidad. Es el repositorio central de un conjunto de tablas que asignan ambos tipos nativos a puntos de extensión, así como construcciones sintéticas a puntos de extensión. Además, es la entidad responsable de la conversión boxing de objetos (conversión de valores ordinales o cadenas en IModelObject).

Las interfaces siguientes se definen para esta categoría:

Acceso general al Administrador de modelos de datos

IDataModelManager / IDataModelManager2

Administración de scripts

IDataModelScriptManager

IDataModelScriptProviderEnumerator

Acceso al sistema de tipos y los espacios de memoria del depurador

El sistema de tipos subyacente y los espacios de memoria del depurador se exponen en detalle para que las extensiones usen. Las interfaces siguientes se definen para esta categoría:

Interfaces de host general (depurador)

IDebugHost

IDebugHostStatus

IDebugHostContext

IDebugHostMemory / IDebugHostMemory2

IDebugHostErrorSink

IDebugHostEvaluator / IDebugHostEvaluator2

IDebugHostExtensibility

Interfaces del sistema de tipo Host (Depurador)

IDebugHostSymbols

IDebugHostSymbol / IDebugHostSymbol2

IDebugHostModule

IDebugHostType / IDebugHostType2

IDebugHostConstant

IDebugHostField

IDebugHostData

IDebugHostBaseClassIDebugHostPublic

IDebugHostModuleSignature

IDebugHostTypeSignature

Compatibilidad con host (depurador) para scripting

IDebugHostScriptHost

Creación y consumo de scripts

El modelo de datos también tiene una noción general de lo que es un script y cómo depurar uno. Es totalmente posible que una extensión del depurador llegue y defina un puente general entre el modelo de datos y otro lenguaje dinámico (normalmente un entorno de scripting). Este conjunto de interfaces es cómo se logra así como cómo una interfaz de usuario del depurador puede usar dichos scripts.

Las interfaces siguientes se definen para esta categoría:

Interfaces de script generales

IDataModelScriptProvider

IDataModelScript

IDataModelScriptClient

IDataModelScriptHostContext

IDataModelScriptTemplate

IDataModelScriptTemplateEnumerator

IDataModelNameBinder

Interfaces del depurador de scripts

IDataModelScriptDebug

IDataModelScriptDebugClient

IDataModelScriptDebugStack

IDataModelScriptDebugStackFrame

IDataModelScriptDebugVariableSetEnumerator

IDataModelScriptDebugBreakpoint

IDataModelScriptDebugBreakpointEnumerator

Uso de la biblioteca DbgModelClientEx

Información general

Las interfaces de objetos de C++ del modelo de datos pueden ser muy detalladas para implementar. Aunque permiten la manipulación completa del modelo de datos, requieren la implementación de varias interfaces pequeñas para ampliar el modelo de datos (por ejemplo, una implementación de IModelPropertyAccessor para cada propiedad capturable dinámica que se agrega). Además de esto, el modelo de programación basado en HRESULT agrega una cantidad significativa de código de placa reutilizable que se usa para la comprobación de errores.

Para minimizar algunos de estos trabajos, hay una biblioteca auxiliar completa de C++ para el modelo de datos que usa un paradigma completo de programación de plantillas y excepciones de C++. El uso de esta biblioteca permite código más conciso al consumir o extender el modelo de datos y se recomienda.

Hay dos espacios de nombres importantes en la biblioteca auxiliar:

Debugger::D ataModel::ClientEx: asistentes para el consumo del modelo de datos

Debugger::D ataModel::P roviderEx: asistentes para la extensión del modelo de datos

Para obtener más información sobre el uso de la biblioteca DbgModelClientEx, consulte el archivo Léame en este sitio de GitHub:

https://github.com/Microsoft/WinDbg-Libraries/tree/master/DbgModelCppLib

Ejemplo de C++ HelloWorld

Para ver cómo se puede usar la biblioteca DbgModelClientEx, revise el ejemplo HelloWorld de Modelo de datos HelloWorld aquí.

https://github.com/Microsoft/WinDbg-Samples/tree/master/DataModelHelloWorld

El ejemplo incluye:

  • HelloProvider.cpp: se trata de una implementación de una clase de proveedor que agrega una nueva propiedad de ejemplo "Hello" a la noción de un proceso del depurador.

  • SimpleIntroExtension.cpp: se trata de una extensión simple del depurador que agrega una nueva propiedad de ejemplo "Hello" a la noción de proceso del depurador. Esta extensión se escribe en la biblioteca auxiliar del modelo de datos C++17. Es mucho preferible escribir extensiones en esta biblioteca en lugar de la ABI COM sin procesar debido al volumen (y la complejidad) del código de pegado que es necesario.

Ejemplos de JavaScript y COM

Para comprender mejor las distintas formas de escribir una extensión del depurador con el modelo de datos, hay tres versiones de la extensión HelloWorld del modelo de datos disponible aquí:

https://github.com/Microsoft/WinDbg-Samples/tree/master/DataModelHelloWorld

  • JavaScript: una versión escrita en JavaScript

  • C++17: una versión escrita en la biblioteca cliente de C++17 del modelo de datos

  • COM: una versión escrita en la ABI COM sin procesar (solo con WRL para asistentes COM)


Vea también

Interfaces de C++ del modelo de datos del depurador

Objetos C++ del modelo de datos del depurador

Interfaces adicionales del modelo de datos del depurador de C++

Conceptos de C++ del modelo de datos del depurador

Scripting del modelo de datos del depurador de C++