Структура библиотеки DLL расширения DbgEng
Библиотека DLL расширения DbgEng экспортирует ряд функций обратного вызова, некоторые из которых могут быть реализациями команд расширения.
Эти библиотеки DLL расширений загружаются подсистемой отладчика и могут обеспечить дополнительные функциональные возможности или автоматизацию задач при выполнении отладки в пользовательском режиме или режиме ядра в Microsoft Windows.
Если вы выполнили полную установку средств отладки для Windows, пример расширения DbgEng с именем exts можно найти в подкаталоге sdk\samples\exts каталога установки.
Команды расширения
Библиотека DLL расширения может экспортировать любое количество функций, используемых для выполнения команд расширения. Каждая функция явно объявлена как экспорт в DEF-файле, и ее имя должно состоять полностью из строчных букв.
Функции, используемые для реализации команд расширения, должны соответствовать прототипу PDEBUG_EXTENSION_CALL.
Эти функции называются в соответствии со стандартным соглашением C++, за исключением того, что буквы верхнего регистра не допускаются. Экспортируемое имя функции и имя команды расширения идентичны, за исключением того, что команда расширения начинается с восклицательного знака (!). Например, при загрузке myextension.dll в отладчик и вводе !stack в окне Команда отладчика отладчик ищет экспортированную функцию с именем stack в myextension.dll.
Если myextension.dll еще не загружен или в других библиотеках DLL расширения могут быть другие команды расширения с тем же именем, введите !myextension.stack в окне Команда отладчика, чтобы указать библиотеку DLL расширения и команду расширения в этой библиотеке DLL.
Другие экспортированные функции
Библиотека DLL расширения DbgEng должна экспортировать DebugExtensionInitialize. Он будет вызываться при загрузке библиотеки DLL для инициализации библиотеки DLL. Она может использоваться библиотекой DLL для инициализации глобальных переменных.
Библиотека DLL расширения может экспортировать DebugExtensionUninitialize. При экспорте он будет вызываться до выгрузки библиотеки DLL расширения. Он может использоваться библиотекой DLL для очистки перед его выгрузки.
Библиотека DLL расширения может экспортировать DebugExtensionNotify. Если экспортируется, он будет вызываться при запуске или завершении сеанса, а также при запуске или остановке выполнения целевого объекта. Эти уведомления также предоставляются объектам IDebugEventCallbacks, зарегистрированным в клиенте.
Библиотека DLL расширения может экспортировать KnownStructOutput. При экспорте он будет вызываться при загрузке библиотеки DLL. Эта функция возвращает список структур, которые библиотека DLL умеет печатать в одной строке. Он может быть вызван позже для форматирования экземпляров этих структур для печати.
Процедура обработчика для загрузки библиотеки DLL расширения DbgEng
При загрузке библиотеки DLL расширения функции обратного вызова вызываются подсистемой в следующем порядке:
DebugExtensionInitialize вызывается для инициализации библиотеки DLL расширения.
При экспорте debugExtensionNotify вызывается, если подсистема имеет активный сеанс, и вызывается снова, если сеанс приостановлен и доступен.
При экспорте вызывается KnownStructOutput , чтобы запросить список структур, которые библиотека DLL умеет печатать в одной строке.
Сведения о том, как использовать отладчик для загрузки и выгрузки библиотеки DLL расширения, см. в статье Загрузка библиотек DLL расширения отладчика , а сведения о выполнении команды расширения см. в статье Использование команд расширения отладчика .
Подсистема отладчика разместит блок try/except вокруг вызова библиотеки DLL расширения. Это защищает подсистему от некоторых типов ошибок в коде расширения; но, так как вызовы расширений выполняются в том же потоке, что и подсистема, они по-прежнему могут привести к сбою.