Препроцессор трассировки программного обеспечения Windows - Windows software trace preprocessor
Эта статья поднимает множество проблем. Пожалуйста помоги Улучши это или обсудите эти вопросы на страница обсуждения. (Узнайте, как и когда удалить эти сообщения-шаблоны) (Узнайте, как и когда удалить этот шаблон сообщения)
|
В Windows программный препроцессор трассировки (WPP; препроцессор и связанные с ним инструменты поддержки известны как Отслеживание программного обеспечения WPP) это препроцессор что упрощает использование WMI отслеживание событий для реализации эффективных отслеживание программного обеспечения в водители и Приложения эта цель Windows 2000 и более поздние операционные системы. WPP был создан Microsoft и входит в Windows DDK. Хотя WPP широко применяется, он не включен в Windows SDK, и поэтому в основном используется для драйверов и программного обеспечения поддержки драйверов, производимого поставщиками программного обеспечения, которые покупают Windows DDK.
Фон
Отслеживание программного обеспечения - это специализированное использование протоколирование для записи информации о выполнении программы. Эта информация обычно используется для отладка. В отличие от регистрация событий, основная цель которого - создавать записи о событиях, которые могут быть проверенный к системные администраторы (см. например Просмотрщик событий ) или анализируется инструментами управления, трассировка программного обеспечения - это в первую очередь средство отладки для разработчики программного обеспечения. Таким образом, многие из нефункциональные требования регистрации событий, например локализуемость или основанный на стандартах выходной формат, явно не являются целями для большинства приложений трассировки программного обеспечения. С другой стороны, трассировка программного обеспечения предъявляет особые требования к спектакль которые обычно не так важны при регистрации событий. Например, одно из распространенных способов отслеживания программного обеспечения, вход / выход трассировка, производит вывод в точке входа и возвращает функции или же методы так что разработчик может визуально проследить путь выполнения, часто включая параметры и возвращаемые значения, в отладчике или текстовом файле журнала (это можно рассматривать как время выполнения аналог схема последовательности ). Этот тип трассировки, хотя и полезен для разработчиков, может сильно снизить производительность программного продукта, если его нельзя отключить (либо на время компиляции через условную компиляцию или во время выполнения через флаги ).
Дополнительные особенности, касающиеся трассировки программного обеспечения, включают следующее:
- В проприетарное программное обеспечение, данные отслеживания могут включать конфиденциальную информацию о продукте исходный код.
- Если трассировка включена или отключена во время выполнения, многие методы трассировки требуют включения значительного количества дополнительных данных в двоичный файл, что может косвенно снизить производительность, даже если трассировка отключена.
- Если трассировка включена или отключена во время компиляции, получение данных трассировки для проблемы на компьютере клиента зависит от желания и возможности клиента установить специальную версию вашего программного обеспечения с включенной трассировкой.
- Некоторые типы программного обеспечения, например драйверы, должны соответствовать строгим требованиям к производительности даже при включенной трассировке.
В связи с первыми двумя соображениями традиционные методы трассировки программного обеспечения используют условную компиляцию для включения или отключения трассировки (и включения данных трассировки) во время компиляции. Например, используя Препроцессор C, можно определить макрос DebugOut
следующее:
#ifdef _DEBUG # define DebugOut (msg, ...) DebugPrintf (__ FUNCTION__ "(" __FILE__ ":" TO_STRING (__ LINE__) ")" msg, __VAR_ARGS __) # else # define DebugOut (msg, ...) # endif
куда НАНИЗЫВАТЬ
- макрос, преобразующий номер строки (__ЛИНИЯ__
) к строке и DebugPrintf
это printf -подобная функция, которая может, например, выводить текст в отладчик.
Затем следующий код:
DebugOut («Произошла ошибка% d», код_ошибки);
будет выдавать результат, аналогичный следующему только для отладочных сборок:
SomeFunction (file.c: 78) Произошла ошибка 217
Другой метод для определенных типов трассировки (особенно трассировки входа / выхода) заключается в использовании приборы. Хотя этот метод может решить многие из основных проблем, он не всегда доступен (обычно только в управляемый код ).
Трассировка событий WMI - это пример технологии, которая касается, в частности, производительности трассировки критически важного для производительности кода, такого как драйверы. Он также может решить проблему контроля распространения конфиденциальной информации трассировки, позволяя разработчику определять удобочитаемые данные трассировки («Произошла ошибка% d»
в примере выше) отдельно от кода, чтобы он не был встроен в продукт (в коде конкретное сообщение упоминается по его номеру сообщения). Однако есть некоторые важные ограничения:
- Трассировка событий WMI не может сама по себе автоматически генерировать
"SomeFunction (file.c: 78)"
часть сообщения трассировки. Это ограничение всех таких технологий, не относящихся к трассировке событий WMI. - Требование отделения читаемой человеком части данных трассировки от кода может снизить читабельность кода.
- Использование этого метода может привести к значительным накладным расходам на разработку для одноразовых сообщений трассировки.
Работа ВЭС
WPP запускается до компиляции (другими словами, даже до препроцессора C) и генерирует заголовок сообщения трассировки для каждого обрабатываемого файла (по умолчанию этот заголовок filename.tmh
, куда имя файла
это имя обработанного исходного файла). Затем этот заголовок необходимо явно включить в исходный файл, например:
// File: file.cxx // Этот файл является примером использования WPP # include "file.tmh"
Понимание WPP C /C ++ синтаксис очень ограничен. В частности, не расширяется макросы (кроме особых случаев, когда это необходимо), и не обрабатывает прагмы или выполнить любой семантический анализ.
Разработчик указывает один или несколько макросов трассировки, которые WPP должен обрабатывать, через файл конфигурации, специальные аннотации в комментариях, параметры командной строки или некоторую комбинацию этих методов. Каждый раз, когда WPP встречает один из макросов, который должен обрабатывать, он генерирует макрос сообщения трассировки. Другими словами, если например DoTrace
это макрос трассировки, WPP будет генерировать отдельный макрос для каждого вхождения DoTrace
. Сгенерированные макросы сообщений трассировки устраняются по имени файла и номеру строки, и, используя различные приемы препроцессора, WPP, в свою очередь, определяет исходный макрос трассировки, чтобы он расширял соответствующий макрос сообщения трассировки в каждом случае.
Способ создания макросов сообщений трассировки WPP зависит от файла шаблона (формат файла не документирован). Файлы шаблонов по умолчанию, включенные в WPP, указывают, что строка сообщения трассировки должна быть включена в аннотация (с использованием функции __annotation компилятора Microsoft). Эти строки не включены в скомпилированный код, но включены в файл символов отладчика в формате, понятном инструментам, включенным в WPP. Макросы сообщений трассировки также включают логику для включения или отключения трассировки с помощью флагов и вызовов API трассировки событий WMI.
Ограничения
- Поскольку WPP не расширяет макросы, он не распознает создание экземпляра макроса трассировки, включенного в определение другого макроса. Например, если
DoTrace
это макрос трассировки, а макросCheckForErrors
определяется как:
#define CheckForErrors (код_ошибки) if (IsError (код_ошибки)) {DoTrace («Произошла ошибка% d», err); HandleError (код_ошибки); }
тогда WPP не будет генерировать макросы сообщений трассировки для DoTrace
куда CheckForErrors
происходит. WPP предоставляет специальный обходной путь для этой проблемы, но все еще существует небольшой класс макросов, которые нельзя выразить даже с помощью обходного пути.
- Файл шаблона по умолчанию генерирует код, который будет правильно работать только с компилятором Microsoft. Хотя это не является неотъемлемым ограничением препроцессора, тот факт, что файл шаблона (который контролирует, какой код создается в заголовке сообщения трассировки) использует недокументированный формат, означает, что на практике WPP будет правильно работать только с компилятором Microsoft.
- Более ранние версии WPP вызывали ошибки компиляции, когда в исходный файл было включено более одного заголовка макроса трассировки (например, если исходный файл с трассировкой включал заголовок, который имел трассировку во встроенных функциях). Это исправлено в самой последней версии. Обратите внимание, что это также ограничение файла шаблона, а не самого инструмента WPP.
- Поскольку макросы сообщений трассировки различаются по файлу и номеру строки, в исходном коде может быть только один макрос трассировки на строку.