Опубликован: 06.12.2004 | Доступ: свободный | Студентов: 1179 / 142 | Оценка: 4.76 / 4.29 | Длительность: 20:58:00
ISBN: 978-5-9556-0021-5
Лекция 8:

Трассировка пользовательских приложений

Функции, обслуживающие жизненный цикл потоков трассировки.

На рис. 8.1 показаны основные элементы жизненного цикла потока трассировки и функции, вызов которых трассирующим процессом обеспечивает переход между состояниями.

Основные элементы жизненного цикла потока трассировки.

Рис. 8.1. Основные элементы жизненного цикла потока трассировки.

Создание потока трассировки осуществляется функциями posix_trace_create() или posix_trace_create_withlog() (см. листинг 8.6).

#include <sys/types.h>
#include <trace.h>
int posix_trace_create (pid_t pid, 
    const trace_attr_t *restrict attr, 
    trace_id_t *restrict trid);
int posix_trace_create_withlog (pid_t pid, 
    const trace_attr_t *restrict attr, int fildes, 
    trace_id_t *restrict trid);
Листинг 8.6. Описание функций создания потоков трассировки.

Функция posix_trace_create() создает активный поток, в который будут записываться события   трассировки   целевого процесса с идентификатором pid (при нулевом pid трассируется вызывающий процесс). Ресурсы в потоке отводятся в соответствии со значениями элементов атрибутного объекта, заданного аргументом attr (если attr равен NULL, используются подразумеваемые значения).

Идентификатор созданного потока записывается по указателю trid. Его может использовать только вызывающий процесс.

Фильтр, ассоциированный с новым потоком, пуст.

Одновременно могут быть активными несколько потоков трассировки, однако их общее число не должно превышать значения конфигурационной константы TRACE_SYS_MAX.

Разумеется, попытки трассировать другие процессы подвержены контролю прав доступа.

Функция posix_trace_create_withlog() делает то же, что и posix_trace_create(), но дополнительно ассоциирует с потоком журнал трассировки, заданный файловым дескриптором fildes.

Сразу после создания потока трассировка считается приостановленной. Чтобы активизировать ее, следует воспользоваться функцией posix_trace_start() ; для последующей приостановки нужно вызвать функцию posix_trace_stop() (см. листинг 8.7).

#include <trace.h>
int posix_trace_start (trace_id_t trid);
int posix_trace_stop (trace_id_t trid);
Листинг 8.7. Описание функций активизации и приостановки трассировки.

После вызова posix_trace_start() в поток помещается системное событие   POSIX_TRACE_START, а статус потока получает значение POSIX_TRACE_RUNNING (если трассировка уже шла, вызов posix_trace_start() игнорируется).

После вызова posix_trace_stop() в поток помещается системное событие   POSIX_TRACE_STOP, а статус потока получает значение POSIX_TRACE_SUSPENDED (если трассировка уже была приостановлена, вызов posix_trace_stop() игнорируется).

Если поток трассировки заполнен, вызовы posix_trace_start() и posix_trace_stop() игнорируются.

Функция posix_trace_shutdown() (см. листинг 8.8) завершает трассировку и освобождает ресурсы, ассоциированные с потоком, независимо от того, прочитал ли анализирующий процесс все записанные события.

#include <sys/types.h>
#include <trace.h>
int posix_trace_shutdown (trace_id_t trid);
Листинг 8.8. Описание функции завершения трассировки.

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

После возврата из posix_trace_shutdown() аргумент trid перестает быть корректным идентификатором потока трассировки.

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

По ходу трассировки   управляющий процесс может инициировать сброс потока в журнал, обратившись к функции posix_trace_flush() (см листинг 8.9).

#include <sys/types.h>
#include <trace.h>
int posix_trace_flush (trace_id_t trid);
Листинг 8.9. Описание функции сброса потока трассировки в журнал.

Сброс осуществляется с учетом правил обработки ситуации заполнения журнала.

После завершения сброса пространство в потоке трассировки, которое занимали записанные в журнал события, может быть использовано повторно.

Узнать о завершении операции сброса можно, опрашивая статус потока трассировки с помощью функции posix_trace_get_status() (см. листинг 8.10).

#include <trace.h>
int posix_trace_get_status (trace_id_t trid,
    struct posix_trace_status_info 
                               *statusinfo);
Листинг 8.10. Описание функции опроса статуса потока трассировки.

Функция обеспечивает согласованность данных, которые записываются в структуру типа posix_trace_status_info по указателю statusinfo. Сразу после завершения вызова признаки переполнения и для потока, и для журнала получают значение POSIX_TRACE_NO_OVERRUN, а в поле posix_stream_flush_error помещается нуль.