Трассировка пользовательских приложений
Функции для работы с атрибутными объектами потоков трассировки
Согласно стандарту POSIX-2001, система трассировки строится в объектно-ориентированном стиле. Структура большинства используемых объектов скрыта от приложения, поэтому требуется довольно много относительно мелких функций – конструкторов, селекторов, итераторов.
Для систематического рассмотрения целесообразно представить множество функций трассировки в виде трехуровневой иерархии. Разветвление на верхнем уровне производится в соответствии с ролью процесса ( трассирующий, трассируемый, анализирующий ), а на втором уровне – в соответствии с классом обслуживаемых объектов (потоки и их атрибутные объекты, журналы, события и т.д.). На третьем уровне располагаются функциональные группы, предназначенные для выполнения определенных операций (создание/уничтожение, опрос/изменение и т.п.) над объектами определенных классов.
Чтобы получить общее представление о функциях трассировки, рассмотрим сначала два верхних уровня описанной иерархии.
Трассирующий процесс управляет ресурсами, ассоциированными с потоками трассировки, а именно:
- атрибутными объектами потоков трассировки ;
- собственно потоками трассировки ;
- журналами трассировки ;
- идентификаторами типов событий ;
- фильтрами.
Трассируемый процесс имеет дело со следующими объектами:
- события ;
- идентификаторы типов событий ;
- точки трассировки.
Анализирующий процесс читает:
- потоки трассировки ;
- журналы ;
- события ;
- идентификаторы типов событий.
Перейдем к детальному рассмотрению функций трассировки.
Для создания и уничтожения атрибутных объектов потоков трассировки служат функции posix_trace_attr_init() и posix_trace_attr_destroy() (см. листинг 8.1).
#include <trace.h> int posix_trace_attr_init ( trace_attr_t *attr); int posix_trace_attr_destroy ( trace_attr_t *attr);Листинг 8.1. Описание функций создания и уничтожения атрибутных объектов потоков трассировки.
Функция posix_trace_attr_init() инициализирует атрибутный объект подразумеваемыми значениями для всех атрибутов, используемых реализацией. Отметим, что два атрибута – имя версии системы трассировки и разрешающая способность часов, с помощью которых проставляются временные штампы, – доступны только на чтение.
Нормальным является нулевой результат; при наличии ошибки возвращается ее номер.
Для манипулирования атрибутами, идентифицирующими поток трассировки, служат функции posix_trace_attr_getgenversion(), posix_trace_attr_getname(), posix_trace_attr_setname(), posix_trace_attr_getcreatetime() (см. листинг 8.2).
#include <trace.h> int posix_trace_attr_getgenversion ( const trace_attr_t *attr, char *genversion); int posix_trace_attr_getname ( const trace_attr_t *attr, char *tracename); int posix_trace_attr_setname ( trace_attr_t *attr, const char *tracename); #include <time.h> #include <trace.h> int posix_trace_attr_getcreatetime ( const trace_attr_t *attr, struct timespec *createtime);Листинг 8.2. Описание функций манипулирования атрибутами, идентифицирующими поток трассировки.
Функции опроса копируют значения соответствующих атрибутов (имя версии системы трассировки, имя и время создания потока трассировки ) из атрибутного объекта, заданного аргументом attr, в символьный массив (длина которого должна быть не меньше TRACE_NAME_MAX ) или в структуру. Функция posix_trace_attr_setname() копирует имя (длина которого не должна превышать TRACE_NAME_MAX ) в противоположном направлении.
Функция posix_trace_attr_getclockres() (см. листинг 8.3) позволяет опросить разрешающую способность часов, с помощью которых проставляются временные штампы.
#include <time.h> #include <trace.h> int posix_trace_attr_getclockres ( const trace_attr_t *attr, struct timespec *resolution);Листинг 8.3. Описание функции опроса разрешающей способности часов, с помощью которых проставляются временные штампы.