Общие сведения о модели данных отладчика C++

В этом разделе представлен обзор использования интерфейсов C++ модели данных отладчика для расширения и настройки возможностей отладчика.

Этот раздел является частью серии, в которой описываются интерфейсы, доступные из C++, способы их использования для создания расширения отладчика на основе C++, а также способы использования других конструкций модели данных (например, JavaScript или NatVis) из расширения модели данных C++.

Общие сведения о модели данных отладчика C++

Интерфейсы C++ модели данных отладчика

Объекты C++ модели данных отладчика

Дополнительные интерфейсы C++ модели данных отладчика

Основные понятия модели данных отладчика C++

Скрипты C++ модели данных отладчика


Обзор интерфейса C++ модели данных отладчика

Модель данных отладчика — это расширяемая объектная модель, которая имеет центральное значение для того, как новые расширения отладчика (в том числе в JavaScript, NatVis и C++) потребляют информацию из отладчика и создают информацию, доступ к которой можно получить из отладчика, а также других расширений. Конструкции, которые записываются в API модели данных, доступны в новом (dx) средстве оценки выражений отладчика, а также в расширениях JavaScript или C++.

Чтобы проиллюстрировать цели модели данных отладчика, рассмотрим эту традиционную команду отладчика.

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

Команда отладчика использует двоичную маску и предоставляет вывод только текста нестандартными способами. Выходные данные текста трудно использовать, форматировать или расширять, и макет зависит от этой команды.

Сравните это с командой модели данных отладчика dx (display Debugger Object Model Expression).

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

Эта команда использует стандартную модель данных, которая является обнаруживаемой, расширяемой и компонуемой единым способом.

Логические имена между интервалами и расширение на определенных объектах позволяют обнаружить функциональные возможности расширения отладчика.

Совет

Поскольку интерфейсы объектов C++ модели данных могут быть очень подробными для реализации полной вспомогательной библиотеки C++ для модели данных, которая использует полное исключение C++, и рекомендуется использовать парадигму программирования шаблонов. Дополнительные сведения см. в разделе Использование библиотеки DbgModelClientEx далее в этом разделе.

Модель данных — это способ, которым WinDbg показывает большинство вещей. Многие элементы в новом пользовательском интерфейсе можно запрашивать, расширять или использовать скрипты, так как они работают на основе модели данных. Дополнительные сведения см. в разделе WinDbg — модель данных.

Снимок экрана: окно просмотра модели данных с процессом и потоками.

Представление архитектуры модели данных

На следующей схеме перечислены основные элементы архитектуры модели данных отладчика.

  • Слева отображаются элементы пользовательского интерфейса, которые предоставляют доступ к объектам и поддерживают такие функции, как запросы LINQ.
  • В правой части схемы находятся компоненты, предоставляющие данные для модели данных отладчика. Сюда входят пользовательские расширения модели данных отладчика NatVis, JavaScript и C++.

Схема: архитектура модели данных с общей объектной моделью в центре и поставщиками справа.

Модель объектов

В центре модели данных отладчика находится универсальное представление объекта, в котором все является экземпляром интерфейса IModelObject. Хотя такой объект может представлять встроенный (например, целочисленное значение) или другой интерфейс модели данных, он часто представляет динамический объект — словарь кортежей "ключ-значение/метаданные" и набор понятий, описывающих абстрактное поведение.

На этой схеме показано, как IModelObject использует хранилища ключей для хранения значений, которые поставщик может создавать, регистрировать и обрабатывать.

  • В нем отображается поставщик, предоставляющий сведения для объектной модели.
  • Слева отображается IModelObject, то есть общая объектная модель, используемая для управления объектами.
  • В центре находится хранилище ключей , которое используется для хранения значений и доступа к ней.
  • В нижней части показаны основные понятия , поддерживающие объекты с такими функциями, как возможность преобразования в отображаемую строку или индексирования.

Схема, показывающая архитектуру модели данных с IModelObject в качестве входных данных и хранилищем ключей кортежей.

Модель данных: представление потребителя

На следующей схеме показано представление модели данных потребителя. В этом примере для запроса информации используется команда dx (Display Debugger Object Model Expression).

  • Команда Dx взаимодействует через сериализатор с интерфейсом перечисления объектов.
  • Объекты IDebugHost* используются для сбора сведений из подсистемы отладчика.
  • Вычислители выражений и семантических оценщиков используются для отправки запроса в подсистему отладчика.

Схема, показывающая архитектуру модели данных с пользовательским интерфейсом, передаваемым в средства оценки, которые подключаются к IDebugHost.

Модель данных: представление производителя

На этой схеме показано представление производителя модели данных.

  • Слева отображается поставщик NatVis, который использует XML, определяющий дополнительные функциональные возможности.
  • Поставщик JavaScript может воспользоваться преимуществами концепций динамического поставщика для обработки информации в режиме реального времени.
  • В нижней части показан поставщик машинного кода, который также может определить дополнительные функциональные возможности.

Схема, показывающая архитектуру модели данных с IModelObject, подключенной к потребителям NatVis, JavaScript и машинного кода.

Диспетчер моделей данных

На этой схеме показана центральная роль, которую диспетчер моделей данных играет в управлении объектами.

  • Диспетчер моделей данных выступает в качестве центрального регистратора для всех объектов.
  • Слева показано, как регистрируются стандартные элементы отладчика, такие как сеансы и процесс.
  • В блоке пространства имен отображается центральный список регистрации.
  • В правой части схемы показаны два поставщика: один для NatVis в верхней части и расширение C/C++ в нижней части.

Схема, на которой показана архитектура модели данных с зарегистрированными именами, к которым обращается диспетчер моделей данных.

Сводка интерфейсов модели данных отладчика

Существует множество интерфейсов C++, которые состоят из разных частей модели данных. Чтобы обеспечить согласованное и простое подход к этим интерфейсам, они разбиваются по общей категории. Здесь main области:

Общая объектная модель

Первый и наиболее важный набор интерфейсов определяет, как получить доступ к основной модели данных, а также как получить доступ к объектам и управлять ими. IModelObject — это интерфейс, который представляет каждый объект в модели данных (аналогично объекту C#). Это main интерфейс, который представляет интерес как для потребителей, так и для производителей модели данных. Другие интерфейсы являются механизмами для доступа к различным аспектам объектов. Для этой категории определены следующие интерфейсы:

Мосты между DbgEng и моделью данных

IHostDataModelAccess

Основные интерфейсы

IModelObject

IKeyStore

IModelIterator

IModelPropertyAccessor

IModelMethod

IKeyEnumerator

IRawEnumerator

IModelKeyReference / IModelKeyReference2

Основные интерфейсы

IStringDisplayableConcept

IIterableConcept

IIndexableConcept

IPreferredRuntimeTypeConcept

IDataModelConcept

IDynamicKeyProviderConcept

IDynamicConceptProviderConcept

Управление моделями данных и расширяемость

Диспетчер моделей данных — это основной компонент, который управляет тем, как выполняется расширяемость. Это центральный репозиторий набора таблиц, которые сопоставляют как собственные типы с точками расширения, так и искусственные конструкции с точками расширения. Кроме того, это сущность, которая отвечает за упаковка объектов (преобразование порядковых значений или строк в IModelObject).

Для этой категории определены следующие интерфейсы:

Общий доступ к диспетчеру моделей данных

IDataModelManager / IDataModelManager2

Управление скриптами

IDataModelScriptManager

IDataModelScriptProviderEnumerator

Доступ к системе типов и пространствам памяти отладчика

Системные пространства базовых типов и памяти отладчика подробно представлены расширениям. Для этой категории определены следующие интерфейсы:

Общие интерфейсы узла (отладчик)

IDebugHost

IDebugHostStatus

IDebugHostContext

IDebugHostMemory / IDebugHostMemory2

IDebugHostErrorSink

IDebugHostEvaluator / IDebugHostEvaluator2

IDebugHostExtensibility

Системные интерфейсы типа узла (отладчика)

IDebugHostSymbols

IDebugHostSymbol / IDebugHostSymbol2

IDebugHostModule

IDebugHostType / IDebugHostType2

IDebugHostConstant

IDebugHostField

IDebugHostData

IDebugHostBaseClassIDebugHostPublic

IDebugHostModuleSignature

IDebugHostTypeSignature

Host (Debugger) Support for Scripting

IDebugHostScriptHost

Создание и использование скриптов

Модель данных также имеет общее представление о том, что такое скрипт и как его отлаживать. Вполне возможно, что расширение отладчика определит общий мост между моделью данных и другим динамическим языком (обычно это среда сценариев). Этот набор интерфейсов определяет, как это выполняется, а также как пользовательский интерфейс отладчика может использовать такие скрипты.

Для этой категории определены следующие интерфейсы:

Общие интерфейсы скриптов

IDataModelScriptProvider

IDataModelScript

IDataModelScriptClient

IDataModelScriptHostContext

IDataModelScriptTemplate

IDataModelScriptTemplateEnumerator

IDataModelNameBinder

Скрипты интерфейсов отладчика

IDataModelScriptDebug

IDataModelScriptDebugClient

IDataModelScriptDebugStack

IDataModelScriptDebugStackFrame

IDataModelScriptDebugVariableSetEnumerator

IDataModelScriptDebugBreakpoint

IDataModelScriptDebugBreakpointEnumerator

Использование библиотеки DbgModelClientEx

Обзор

Объектные интерфейсы C++ модели данных для модели данных могут быть очень подробными для реализации. Хотя они позволяют полностью манипулировать моделью данных, им требуется реализация ряда небольших интерфейсов для расширения модели данных (например, реализация IModelPropertyAccessor для каждого добавляемого динамического извлекаемого свойства). Кроме того, модель программирования на основе HRESULT добавляет значительный объем кода плиты котла, который используется для проверки ошибок.

Чтобы свести к минимуму часть этой работы, существует полная вспомогающая библиотека C++ для модели данных, которая использует полную парадигму программирования на C++. Использование этой библиотеки позволяет использовать более краткий код при использовании или расширении модели данных и рекомендуется.

Во вспомогательной библиотеке есть два важных пространства имен:

Debugger::D ataModel::ClientEx — вспомогательные средства для использования модели данных

Debugger::D ataModel::P roviderEx — вспомогательные средства для расширения модели данных

Дополнительные сведения об использовании библиотеки DbgModelClientEx см. в файле сведений на этом сайте GitHub:

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

Пример HelloWorld C++

Чтобы узнать, как можно использовать библиотеку DbgModelClientEx, ознакомьтесь с примером Модели данных HelloWorld C++ здесь.

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

Пример включает в себя:

  • HelloProvider.cpp — это реализация класса поставщика, который добавляет новый пример свойства "Hello" в представление отладчика о процессе.

  • SimpleIntroExtension.cpp — это простое расширение отладчика, которое добавляет новый пример свойства "Hello" в представление отладчика о процессе. Это расширение написано на основе вспомогательной библиотеки модели данных C++17. Гораздо предпочтительнее писать расширения для этой библиотеки, а не для необработанного COM ABI из-за объема (и сложности) требуемого кода приклеивания.

Примеры JavaScript и COM

Чтобы лучше понять различные способы написания расширения отладчика с моделью данных, существует три версии расширения Модели данных HelloWorld, доступные здесь:

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

  • JavaScript — версия, написанная на JavaScript

  • C++17 — версия, написанная на основе клиентской библиотеки модели данных C++17.

  • COM — версия, написанная для необработанного COM ABI (только с использованием WRL для вспомогательных com-приложений).


См. также

Интерфейсы C++ модели данных отладчика

Объекты C++ модели данных отладчика

Дополнительные интерфейсы C++ модели данных отладчика

Основные понятия модели данных отладчика C++

Скрипты C++ модели данных отладчика