Использование Трассировки Программного Обеспечения Wpp В Системном Программировании

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

Но вы всегда сталкивались с ситуацией:

  • при записи в файл - консоль резко влияла на воспроизводимость ошибки;
  • когда многопроцессорное/поточное приложение часто обращается к драйверу и вы не можете сопоставить временные метки и потоки;
  • при воспроизведении ошибки на стороне заказчика сеанс тимвьюера бесполезен, к тому же версия с отладочными символами является приватной;
  • когда системное приложение выходит из строя до того, как система успевает сбросить журналы на диск;
  • или когда макрос ведения журнала в лучшем случае выглядит как
      
      
       

    #define TraceDbg(format, .

    ) \ printf( "(p %d, t %d) - (%s,%d) %s(): " format, GetCurrentProcessId(), GetCurrentThreadId(), __FILE__, __LINE__,__FUNCTION__, __VA_ARGS__ );

  • когда придумаешь другой способ отображения ipaddr или UUID
В статье я представлю быстрый, надежный и универсальный диагностический инструмент для отладки с минимальными накладными расходами, предлагаемый MS для системных приложений — WPP, частично рассмотренный в публикации.

«EventTrace для Windows. Высокоскоростная передача сообщений отладки драйверов по сети» .

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

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

Ключевые термины в ETW: поставщик — приложение, записывающее события, контроллер — контролирует сеанс отладки и потребитель - форматирование информации о сеансе в читаемый формат. На рисунке ниже наглядно показано взаимодействие компонентов.



Использование трассировки программного обеспечения WPP в системном программировании

Перейдем от слов к практике.

В качестве примера модификации возьмем официальный пример сервиса от MS — CppWindowsService и, используя следующие 6 пунктов, рассмотрим вариант использования WPP Tracing. 0. Если вы добавляете WPP в драйвер, то начните читать с пункта 1, так как у нового WDK в шаблонах проектов есть дополнения для WPP, параметры которых доступны через связь .

Копируем файл свойств WppTracingSettings.props из репозитория и подключаем его к проекту вручную, добавляя новый тег Import перед закрытием проекта:

<Import Project=".

\WppTracingSettings.props" /> </Project>

WppTracingSettings.props содержит вызов препроцессора WPP (кстати, он запускается до cl.exe, поэтому обернуть func во что-то другое не получится) и определяет имя проекта, имя и параметры макроса логирования, а также список файлов — в нашем случае все, кроме stdafx. cpp.

<ItemGroup>

Теги: #Windows #WPP #etw #Системное программирование #отладка #Разработка Windows

Вместе с данным постом часто просматривают: