Поделиться через


Обзор модели данных отладчика 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 отладочной модели данных (Показать выражение объектной модели отладчика).

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

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

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

Подсказка

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

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

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

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

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

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

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

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

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

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

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

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

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

На следующей схеме показано представление потребителя модели данных. В примере команды dx (выражение объектной модели отладчика) используется для запроса сведений.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Мосты между 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

Поддержка сценариев для хоста (отладчика)

IDebugHostScriptHost

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

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

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

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

IDataModelScriptProvider

IDataModelScript

IDataModelScriptClient

IDataModelScriptHostContext

IDataModelScriptTemplate

IDataModelScriptTemplateEnumerator

IDataModelNameBinder

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

IDataModelScriptDebug

IDataModelScriptDebugClient

IDataModelScriptDebugStack

IDataModelScriptDebugStackFrame

IDataModelScriptDebugVariableSetEnumerator

IDataModelScriptDebugBreakpoint

IDataModelScriptDebugBreakpointEnumerator

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

Обзор

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

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

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

Отладчик::DataModel::ClientEx — вспомогательные средства для использования модели данных

Отладчик::DataModel::ProviderEx — вспомогательные средства для расширения модели данных

Дополнительные сведения об использовании библиотеки DbgModelClientEx см. в файле readme на этом сайте 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++ для модели данных отладчика