Дорогой читатель, Вероятно, вы написали в своем проекте инструмент логирования и успешно используете его для анализа трудно диагностируемых ошибок.
Но вы всегда сталкивались с ситуацией:
- при записи в файл - консоль резко влияла на воспроизводимость ошибки;
- когда многопроцессорное/поточное приложение часто обращается к драйверу и вы не можете сопоставить временные метки и потоки;
- при воспроизведении ошибки на стороне заказчика сеанс тимвьюера бесполезен, к тому же версия с отладочными символами является приватной;
- когда системное приложение выходит из строя до того, как система успевает сбросить журналы на диск;
- или когда макрос ведения журнала в лучшем случае выглядит как
#define TraceDbg(format, .
) \ printf( "(p %d, t %d) - (%s,%d) %s(): " format, GetCurrentProcessId(), GetCurrentThreadId(), __FILE__, __LINE__,__FUNCTION__, __VA_ARGS__ );
- когда придумаешь другой способ отображения ipaddr или UUID
«EventTrace для Windows. Высокоскоростная передача сообщений отладки драйверов по сети» .
Будучи основанным на ЭТВ , ведение журнала осуществляется операционной системой, использует идентификаторы событий, не содержит никакой служебной информации и автоматически добавляет к событию системные теги (время, поток, процесс, ЦП).
Логирование WPP включено в сборку релиза, что позволяет собирать информацию со стороны клиента без необходимости пересборки отладочной версии.
Ключевые термины в ETW: поставщик — приложение, записывающее события, контроллер — контролирует сеанс отладки и потребитель - форматирование информации о сеансе в читаемый формат. На рисунке ниже наглядно показано взаимодействие компонентов.
Перейдем от слов к практике.
В качестве примера модификации возьмем официальный пример сервиса от 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
-
Сколько Денег Вы Тратите На Запуск Стартапа?
19 Oct, 24 -
Онлайн-Хранилище 2.0
19 Oct, 24