В комплект поставки операционной системы входят ключевые события. Для получения потока событий от операционной системы пользователю достаточно активизировать трассировку. При отладке приложения у разработчика может возникнуть необходимость введения в приложение собственных событий трассировки. Это помогает лучше понять взаимодействие приложения с системой.
Для добавления события трассировки необходимо определить формат записей трассировки, создаваемых программой, в соответствии со стандартами интерфейсов трассировки. Затем в соответствующих точках программы размещают макрокоманды, задающие точки трассировки. После этого инициировать и управлять трассировкой можно будет любым стандартным способом (с помощью команд, подкоманд и вызовов функций). Для форматирования трассировок с помощью команды trcrpt добавьте в файл формата трассировки разделы с описанием и требованиями по форматированию для каждой новой записи трассировки.
Событие трассировки может иметь различные формы. Событие состоит ключевого слова и необязательных слов данных значения системного времени, как показано на рисунке ниже. Для каждой возможной формы записи определяется 4-разрядный тип. Поля типа вводятся программой регистрации событий и позволяют программе создания отчета при обработке данных переходить от события к событию независимо от того, заданы ли для всех событий правила форматирования.
Рис. 12-2. Формат записи трассировки событий. На рисунке изображена таблица, состоящая из 7 строк. Ячейки в первой строке содержат 12--разрядный ИД точки трассировки, 4--разрядный тип и 16--разрядное поле данных. Следующие 5 строк содержат слова данных с 1 по 5, а последняя строка - 32--разрядное значение системного времени. Для первой строки задан обязательный заголовок Ключевое слово. Для следующих 5 строк заданы необязательные заголовки с D1 по D5. Для последней строки задан необязательный заголовок T.
Запись события должна быть как можно более короткой. Для многих системных событий запись содержит только ключевое слово и системное время. Слова данных рекомендуется возможности не использовать, поскольку эффективность их применения невысока. Длинный формат позволяет пользователям сохранять данные различной длины. В этом формате 16-разрядное поле данных ключевого слова преобразуется в поле, которое содержит длину записи события.
Функция трассировки позволяет поддерживать до восьми одновременных каналов трассировки с номерами от 0 до 7. Канал 0 всегда используется для трассировки системных событий, однако его можно использовать и для событий приложений. С помощью остальных семи каналов, которые называются каналами общей трассировки, можно выполнять трассировку программ.
При запуске трассировки по умолчанию применяется канал 0. Для запуска трассировки в канал общего назначения введите команду trace -n номер_канала. При применении каналов общего назначения действуют некоторые ограничения:
Макрокоманды, позволяющие регистрировать события всех типов, определены в файле /usr/include/sys/trcmacros.h. ИД событий определены в файле /usr/include/sys/trchkid.h. Эти файлы необходимо включить в программу, которая регистрирует события трассировки.
Для регистрации событий в канал 0 с указанием системного времени используются команды:
TRCHKL0T(hw) TRCHKL1T(hw,D1) TRCHKL2T(hw,D1,D2) TRCHKL3T(hw,D1,D2,D3) TRCHKL4T(hw,D1,D2,D3,D4) TRCHKL5T(hw,D1,D2,D3,D4,D5)
Для регистрации событий в канале 0 без указания системного времени используются команды:
TRCHKL0(hw) TRCHKL1(hw,D1) TRCHKL2(hw,D1,D2) TRCHKL3(hw,D1,D2,D3) TRCHKL4(hw,D1,D2,D3,D4) TRCHKL5(hw,D1,D2,D3,D4,D5)
Тип поля записи события трассировки задается командой независимо от значения 4 разрядов параметра hw.
Регистрировать события в каналах общего назначения (1-7) можно только с помощью следующих 2 макросов:
TRCGEN(ch,hw,D1,len,buf) TRCGENT(ch,hw,D1,len,buf)
Эти макросы регистрируют в потоке событий, заданном параметром канала (ch), ключевое слово (hw), слово данных (D1) и len байт, пользовательского сегмента данных с байта, заданного значением buf.
ИД события в записи трассировки служит для указания класса, к которому относится это событие. ИД события служит критерием как для регистрации или игнорирования событий алгоритмом трассировки, так и для включения или исключения командой trcrpt записей трассировки в отформатированный отчет.
ИД события представляет собой 12-разрядное двоичное число (три шестнадцатиричные цифры), поэтому всего возможно 4096 различных ИД. Зарезервированные ИД событий, для которых код задан по умолчанию, фиксируются для предотвращения дублирования. Для определения событий в пользовательских средах или для использования в процессе разработки ИД событий в диапазоне от x010 до x0FF зарезервированы для временного использования. ИД событий из этого диапазона можно применять в пользовательских средах (то есть в любом наборе систем, в котором можно гарантировать уникальность события с этим ИД).
Примечание: Необходимо убедиться в том, что код, в котором применяются события из этого диапазона, будет использоваться только в исходной пользовательской среде. Если ваша программа, в которой используются временные ключевые ИД, попадет в вычислительную среду, где вы не можете контролировать использование этих ИД, возможны конфликты с другими программами из этой среды, которые также используют эти ИД.
Количество доступных ИД событий невелико, поэтому не следует выделять их без необходимости; Для увеличения количества идентификаторов можно применять 16-разрядное поле данных. В результате каждому формальному ключевому ИД можно сопоставить 65536 различных событий. Единственное преимущество применения уникальных ИД связано с тем, что сбор и фильтрация данных утилитой трассировки производится именно на уровне ИД.
Пользовательское событие можно отформатировать с помощью команды trcrpt, если указанный файл формата трассировки содержит соответствующий раздел. Файл формата трассировки - это изменяемый текстовый файл (дополнительная информация приведена в разделе Синтаксис разделов файла формата трассировки).
Ниже приведен пример оценки времени выполнения цикла программы с помощью событий трассировки:
#include <sys/trcctl.h> #include <sys/trcmacros.h> #include <sys/trchkid.h> char *ctl_file = "/dev/systrctl"; int ctlfd; int i; main() { printf("настройка сбора данных трассировки \n"); if (trcstart("-ad")){ perror("trcstart"); exit(1); } printf("открытие устройства трассировки \n"); if((ctlfd = open(ctl_file,0))<0){ perror(ctl_file); exit(1); } printf("начало трассировки \n"); if(ioctl(ctlfd,TRCON,0)){ perror("TRCON"); exit(1); } for(i=1;i<11;i++){ TRCHKL1T(HKWD_USER1,i); /* Здесь следует контролируемый фрагмент программы. Интервал */ /* между появлениями THKWD_USER1 в файле трассировки */ /* равен полному времени одной итерации */ } printf("завершение трассировки \n"); if(ioctl(ctlfd,TRCSTOP,0)){ perror("TRCOFF"); exit(1); } printf("завершение работы демона трассировки \n"); if (trcstop(0)){ perror("trcstop"); exit(1); } exit(0); }
При компилировании примера программы необходимо использовать ссылку на библиотеку librts.a следующим образом:
# xlc -O3 sample.c -o sample -l rts
HKWD_USER1 - это событие с ИД x010 (для дополнительной проверки обратитесь к файлу /usr/include/sys/trchkid.h). Средство создания отчетов будет форматировать событие HKWD_USER1, только если файл формата трассировки содержит соответствующие правила. Для этого можно использовать следующий пример раздела для события HKWD_USER1:
# Раздел описания правил форматирования HKWD_USER1 # Правила описывают использование события программой-примером 010 1.0 L=APPL "USER EVENT - HKWD_USER1" O2.0 \n \ "Количество итераций =" U4 \n \ "Время последнего цикла = " \ endtimer(0x010,0x010) starttimer(0x010,0x010)
При вводе примера раздела не изменяйте файл основного формата /etc/trcfmt; рекомендуется создать его копию и сохранить в своем пользовательском каталоге (например, mytrcfmt). При запуске примера программы необработанные данные о событиях заносятся в файл протокола по умолчанию, поскольку для функции trcstart() не был задан другой файл протокола. Для получения данных только о нужных событиях с финальным отчетом можно использовать фильтр. Для этого введите команду trcrpt со следующими параметрами:
# trcrpt -d 010 -t mytrcfmt -O "exec=on" > sample.rpt
Для просмотра результатов вы можете обратиться к файлу sample.rpt.
Файл формата трассировки содержит правила представления и просмотра данных для каждого ИД события. Это позволяет форматировать новые события, не внося изменений в средства генерации отчетов. Правила для новых событий просто добавляются в файл форматирования. Синтаксис правил обеспечивает гибкость представления данных.
Раздел файла форматирования может иметь любой размер, необходимый для описания правил для определенного события. Для того чтобы продолжить раздел на следующей строке, в конце текущей строки указывают символ продолжения '\'. Эти поля описаны в книге Файлы AIX 5L версии 5.1.
Информация о прочих возможностях макрокоманд и функции форматирования, а также определении дополнительных макрокоманд приведена в файле /etc/trcfmt.