Трассировка пользовательских приложений
Помимо величин, фигурирующих в структуре типа posix_trace_event_info, с событиями (и пользовательскими, и системными ) могут быть ассоциированы дополнительные данные, помогающие в их интерпретации событий.
Структура типа posix_trace_status_info содержит информацию о состоянии активного потока трассировки. Согласно стандарту POSIX-2001, она должна содержать по крайней мере следующие поля.
int posix_stream_status; /* Состояние потока трассировки */ int posix_stream_full_status; /* Признак заполненности потока */ int posix_stream_overrun_status; /* Признак потери информации */ int posix_stream_flush_status; /* Идет ли в данный момент сброс в журнал */ int posix_stream_flush_error; /* Были ли ошибки при последнем сбросе */ int posix_log_overrun_status; /* Признак потери информации в журнале */ int posix_log_full_status; /* Признак заполненности журнала */
Значение поля posix_stream_status отражает режим, в котором находится поток трассировки:
POSIX_TRACE_RUNNING
Трассировка выполняется, поток принимает события.
POSIX_TRACE_SUSPENDED
Трассировка приостановлена (или не начиналась), поток не принимает события.
Поле posix_stream_full_status отражает состояние заполненности потока. Оно может содержать следующие значения.
POSIX_TRACE_FULL
Пространство в потоке исчерпано.
POSIX_TRACE_NOT_FULL
В потоке есть свободное пространство для событий.
Отметим, что на практике возможны все четыре комбинации значений полей posix_stream_status и posix_stream_full_status. В частности, сочетание POSIX_TRACE_RUNNING и POSIX_TRACE_FULL свидетельствует о том, что трассировка идет, но с потерей информации (новые события записываются на место старых).
Поле posix_stream_overrun_status содержит признак потери информации. Возможные значения:
POSIX_TRACE_OVERRUN
По крайней мере одно событие было потеряно (и, следовательно, не содержится в потоке трассировки ).
POSIX_TRACE_NO_OVERRUN
Ни одно событие не потеряно.
События могут теряться, если они генерируются при заполненном потоке или во время сброса потока трассировки в журнал.
Поле posix_stream_flush_status содержит признак того, что в данный момент происходит сброс потока трассировки в журнал. Возможных значений, разумеется, два.
POSIX_TRACE_FLUSHING
В данный момент происходит сброс потока трассировки в журнал.
POSIX_TRACE_NOT_FLUSHING
В данный момент не происходит сброс потока трассировки в журнал.
В поле posix_stream_flush_error находится нуль, если последний сброс прошел нормально; в противном случае там хранится код первой случившейся при сбросе ошибки (информация о последующих ошибках теряется).
Поле posix_log_overrun_status содержит признак потери информации в журнале с двумя возможными значениями: POSIX_TRACE_OVERRUN и POSIX_TRACE_NO_OVERRUN.
Поле posix_log_full_status служит признаком заполненности журнала. Возможных значений, естественно, два: POSIX_TRACE_FULL и POSIX_TRACE_NOT_FULL.
При создании потока трассировки его атрибуты стандартным для POSIX-2001 образом извлекаются из атрибутного объекта. Стандартом предусмотрены следующие атрибуты:
- имя версии системы трассировки ;
- имя потока трассировки ;
- время создания потока трассировки ;
- разрешающая способность часов, с помощью которых проставляются временные штампы ;
- минимальное число байт, резервируемое для записи событий ;
- правила обработки ситуации заполнения потока трассировки ;
- максимальный размер (в байтах) записываемых в поток событий трассировки ;
- признак наследования трассировки порожденными процессами ;
- максимальный размер (в байтах) журнала трассировки, ассоциированного с потоком;
- правила обработки ситуации заполнения журнала трассировки.
И для потоков, и для журналов трассировки правила обработки ситуации заполнения могут сводиться к записи новых событий поверх самых старых (политика POSIX_TRACE_LOOP ) или к приостановке трассировки ( POSIX_TRACE_UNTIL_FULL ). Кроме того, для потоков может быть предусмотрен сброс в журнал с последующей очисткой (политика POSIX_TRACE_FLUSH ), а для для журналов – потенциально неограниченное расширение ( POSIX_TRACE_APPEND ).
Трассировка с записью в создаваемый поток может как наследоваться, так и не наследоваться порожденными процессами. Соответствующие значения признака наследования именуются POSIX_TRACE_INHERITED и POSIX_TRACE_CLOSE_FOR_CHILD.
В заключение раздела еще раз подчеркнем важные достоинства, которыми обладает механизм трассировки.
- В большинстве случаев трассировка приложения допустимым образом влияет на временные характеристики его выполнения, поэтому трассировку можно применять в штатном режиме функционирования.
- Трассировка позволяет отразить поведение программы, состоящей из произвольного числа сущностей.
- Трассировка позволяет унифицировать механизм сообщений о поведении приложения. Она является готовым решением по организации такого механизма.
Можно рекомендовать максимально широкое использование средств трассировки в процессе разработки и эксплуатации прикладных программ. Целесообразно с самого начала разработки программ встраивать в них генерацию (по возможности эффективную, без лишних накладных расходов) пользовательских событий во всех ошибочных и необычных ситуациях.
Разумеется, общее число генерируемых событий, включая системные, велико, однако разумное применение средств фильтрации и сброса в журнал позволяет смягчить эту проблему.