Трассировка
С логической точки зрения в трассировке участвуют три процесса:
- трассируемый (целевой);
- трассирующий (управляющий трассировкой);
- анализирующий данные трассировки.
Сведения о действиях, производимых при выполнении приложения, фиксируются в виде объектов данных, называемых событиями трассировки. События записываются в потоки трассировки, которые содержат также служебные данные, необходимые для интерпретации событий.
Трассируемый процесс должен быть специальным образом оборудован: его программа должна содержать точки трассировки – действия, способные генерировать события трассировки.
События трассировки подразделяются на две категории:
- пользовательские;
- системные.
Пользовательские события генерируются при вызове функции posix_trace_event().
Системные события генерируются реализацией в ответ на действия ОС или приложения.
У событий трассировки есть типы и имена, между которыми устанавливается взаимно-однозначное соответствие.
Стандартом POSIX-2001 предусмотрен механизм фильтрации, позволяющий отключить генерацию событий определенных типов и, тем самым, уменьшать объем трассировочных данных.
Потоки трассировки, как правило, хранят только в оперативной памяти. Если нужно получить стабильную копию потока для последующего анализа, его следует сбросить в журнал трассировки.
И для потоков, и для журналов трассировки правила обработки ситуации заполнения могут сводиться к записи новых событий поверх самых старых или к приостановке трассировки. Кроме того, для потоков может быть предусмотрен сброс в журнал с последующей очисткой, а для для журналов – потенциально неограниченное расширение.
При создании потока трассировки его атрибуты стандартным для POSIX-2001 образом извлекаются из атрибутного объекта.
Для создания и уничтожения атрибутных объектов потоков трассировки применяются функции posix_trace_attr_init() и posix_trace_attr_destroy().
Для манипулирования атрибутами, идентифицирующими поток трассировки, служат функции posix_trace_attr_getgenversion(), posix_trace_attr_getname(), posix_trace_attr_setname(), posix_trace_attr_getcreatetime().
Функция posix_trace_attr_getclockres() позволяет опросить разрешающую способность часов, с помощью которых проставляются временные штампы.
Поведенческие атрибуты потоков и журналов обслуживаются функциями posix_trace_attr_getinherited(), posix_trace_attr_setinherited(), posix_trace_attr_getstreamfullpolicy(), posix_trace_attr_setstreamfullpolicy(), posix_trace_attr_getlogfullpolicy(), posix_trace_attr_setlogfullpolicy().
Опросить и установить хранящиеся в атрибутном объекте размеры событий, потоков и журналов можно с помощью функций posix_trace_attr_getmaxdatasize(), posix_trace_attr_setmaxdatasize(), posix_trace_attr_getmaxsystemeventsize(), posix_trace_attr_getmaxusereventsize(), posix_trace_attr_getstreamsize(), posix_trace_attr_setstreamsize(), posix_trace_attr_getlogsize(), posix_trace_attr_setlogsize().
Создание потока трассировки осуществляется функциями posix_trace_create() или posix_trace_create_withlog().
Чтобы активизировать трассировку, следует воспользоваться функцией posix_trace_start(); для последующей приостановки нужно вызвать функцию posix_trace_stop().
Функция posix_trace_shutdown() завершает трассировку и освобождает ресурсы, ассоциированные с потоком.
По ходу трассировки управляющий процесс может инициировать сброс потока в журнал, обратившись к функции posix_trace_flush().
Опрос статуса потока трассировки осуществляется с помощью функции posix_trace_get_status().
Стандартом POSIX-2001 предусмотрен опрос атрибутов потока трассировки. Для этого служит функция posix_trace_get_attr().
Поток и журнал трассировки можно очистить от хранящихся там событий, воспользовавшись функцией posix_trace_clear().
При опросе и установке фильтров событий трассировки (функции posix_trace_get_filter() и posix_trace_set_filter()) применяется апробированная схема работы с множествами, основанная на функциях posix_trace_eventset_empty(), posix_trace_eventset_fill(), posix_trace_eventset_add(), posix_trace_eventset_del(), posix_trace_eventset_ismember().
Играющие техническую роль функции posix_trace_trid_eventid_open(), posix_trace_eventid_get_name() и posix_trace_eventid_equal() обслуживают идентификаторы типов событий, рассматриваемые как абстрактные объекты.
Функции posix_trace_eventtypelist_getnext_id() и posix_trace_eventtypelist_rewind() позволяют обрабатывать совокупность идентификаторов типов событий, присутствующих в заданном потоке трассировки.
Функция posix_trace_eventid_open() ассоциирует имя события с идентификатором типа.
Анализирующий процесс обычно открывает журнал трассировки, обращаясь к функции posix_trace_open(), а обработав, закрывает его с помощью функции posix_trace_close(), быть может, в промежутке позиционируясь на начало журнала посредством функции posix_trace_rewind(). Для чтения событий служат функции posix_trace_getnext_event(), posix_trace_timedgetnext_event() и posix_trace_trygetnext_event().