Функция трассировки

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

Предусмотрена возможность трассировки набора работающих процессов или нитей, а также запуска произвольной программы в режиме трассировки.

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

Дополнительная информация о трассировщике приведена в следующих разделах:

Основные сведения о планировщике

Трассировщик находится в наборе файлов bos.sysmgt.trace. Для того чтобы узнать, установлен ли данный набор файлов, введите следующую команду:

lslpp -l | grep bos.sysmgt.trace

Если в данные вывода содержат строку bos.sysmgt.trace , то набор файлов установлен, в противном случае, его необходимо установить.

Трассировщик системы сохраняет информацию о событиях трассировки, которую затем можно отформатировать командой trace report. События трассировки включены в ядро или код приложения, но отслеживаются только во время трассировки.

Запустить трассировку позволяет команда trace и функция trcstart. Для завершения трассировки предназначены команда trcstop и функция trcstop. Для приостановки и возобновления трассировки предназначены команды trcoff и trcon, а также функции trcoff и trcon.

После того как трассировка была остановлена с помощью команды trcstop, команда trcrpt позволяет создать отчет. Формат записей, применяемый данной командой, задается в файле шаблона /etc/trcfmt. Для установки шаблонов предназначена команда trcupdate. Дополнительная информация о шаблонах приведена в описании команды trcupdate.

Управление трассировкой

Команда trace позволяет запустить трассировку событий системы и задать размер буфера и файла протокола трассировки.

Существует три способа сбора данных трассировки.

  1. По умолчанию данные непрерывно собираются в два буфера, причем пока данные трассировки заносятся в один буфер, данные другого буфера записываются в файл протокола. Если файл протокола достигает максимального размера, новые данные записываются поверх наиболее ранних записей.
  2. При циклическом способе сбор данных выполняется непрерывно, однако файл протокола записывается только после завершения трассировки. Этот способ применяется при отладке локализованной ошибки, если необходимо получить данные в момент ее возникновения. Трассировку можно запустить в любой момент, а затем завершить ее сразу после возникновения ошибки, таким образом будут получены данные о событиях, предшествовавших возникновению ошибки. Для применения этого способа трассировки необходимо указать флаг демона трассировки -l.
  3. При третьем способе применяется один буфер, трассировка завершается при его заполнении, после чего данные из буфера записываются в файл протокола. В этот момент трассировка не завершается, а отключается (как если бы была введена команда trcoff ). Обычно на этом этапе трассировка завершается командой trcstop. Этот способ применяется, если до сбора данных трассировка не должна заменять ввод-вывод и содержимое буферов. Для применения этого способа трассировки необходимо указать флаг -f.

Обычно команда trace запускается в асинхронном режиме, т.е. после ее запуска можно продолжить работу обычным образом. Для запуска трассировки в асинхронном режиме нужно указать флаг -a или -x. Если будет указан флаг -a, для прекращения трассировки нужно будет выполнить команду trcstop. Если будет указан флаг -x, трассировка будет автоматически прекращена после завершения работы программы.

Рекомендуется ограничивать отслеживаемую информацию. Флаги -j события и -k события позволяют указать наборы событий, которые будут включены (-j) в трассировку или исключены (-k) из нее.

Прим.: Ограничивая трассировку отдельными процессами или нитями, вы ограничиваете объем информации, доступной для трассировки.

Для просмотра имен программ, связанных с точками трассировки, необходимо включить соответствующие точки трассировки. Их можно указать с помощью группы событий трассировки tidhk. Например, для трассировки точки mbuf 254 и просмотра имен программ необходимо ввести следующую команду trace:

trace -aJ tidhk -j 254

Выполняется трассировка. Для завершения трассировки введите следующую команду:

trcstop
trcrpt -O exec=on

Опция trcrpt -O exec=on позволяет просмотреть имена программ. За дополнительной информацией обратитесь к описанию команды trcrpt.

В некоторых случаях рекомендуется указывать размер буфера и максимальный размер файла протокола. Для буферов трассировки необходима физическая память, так как запись точек трассировки должна выполняться без подкачки. После достижения максимального размера файла протокола данные трассировки записываются поверх наиболее ранних записей. Флаги -T размер и -L размер позволяют указать в байтах размер буферов и максимальный размер данных трассировки в файле протокола.

Прим.: Так как трассировщик резервирует для буферов сбора данных определенный объем оперативной памяти системы, трассировка может оказать негативное влияние на производительность системы с небольшим объемом оперативной памяти. Если трассируемому приложению достаточно оперативной памяти, или объем памяти, используемой функцией трассировки, составляет небольшой процент от общего объема оперативной памяти системы, влияние трассировки на производительность будет небольшим. Если значение не указано, применяется размер, заданный по умолчанию.

Управлять трассировкой можно и из приложения. Дополнительная информация приведена в описаниях команд trcstart и trcstop.

Запись данных событий трассировки

Существует два типа данных трассировки.

Общие данные
Состоят из слова данных, буфера скрытых данных и длины этих данных. Этот тип применяется для трассировки таких элементов, как полные имена файлов. См. пункт Каналы трассировки общего назначения в разделе Общие сведения о трассировщике. Он расположен в главе Трассировщик.
Прим.: Трассировка отдельных процессов и нитей поддерживается только для канала 0. Она не поддерживается для общих каналов трассировки.
Специальные данные
Это стандартные данные трассировки операционной системы AIX. Записи этого типа состоят из слова точки трассировки и до пяти слов данных трассировки. В 64-разрядных приложениях это 8-байтовые слова. При программировании на языке C для записи специальных данных предназначены макрокоманды TRCHKL0 - TRCHKL5 и TRCHKL0T - TRCHKL5T, определенные в файле /usr/include/sys/trcmacros.h. Если по каким-то причинам эти макрокоманды применять нельзя, ознакомьтесь с описанием функции utrchook.

Создание отчета трассировки

Полное описание команды trcrpt приведено в разделе Команда trcrpt. Эта команда позволяет создать отчет для пользователя на основе файла протокола, сгенерированного командой trace. По умолчанию команда форматирует данные из файла протокола /var/adm/ras/trcfile. Выходные данные команды trcrpt отправляется в стандартный вывод.

Для создания отчета трассировки из файла по умолчанию и его записи в /tmp/rptout введите команду

trcrpt >/tmp/rptout

Для создания отчета трассировки с названиями программ и именами системных вызовов из файла /tmp/tlog и его записи в файл /tmp/rptout введите команду

trcrpt -O exec=on,svc=on /tmp/tlog >/tmp/rptout

Получение данных трассировки из дампа

Если во время трассировки был создан системный дамп, данные трассировки можно получить с помощью команды trcdead. Для того чтобы сохранить в системе файл протокола трассировки по умолчанию, укажите опцию -o файл-вывода.

Например:

trcdead -o /tmp/tlog /var/adm/ras/vmcore.0

создает файл протокола трассировки /tmp/tlog, который затем можно отформатировать командой

trcrpt /tmp/tlog

Команды трассировщика

Перечисленные команды являются частью трассировщика:

Команда Функция
trace Запускает трассировку системных событий. С помощью этой команды можно определять размер и параметры файла протокола трассировки, а также внутренних буферов трассировки, в которых хранятся данные об отслеживаемых событиях.
trcdead Извлекает трассировочную информацию из системного дампа. Если в момент останова системы работали средства трассировки, то содержимое внутренних буферов трассировки будет включено в дамп. Эта команда извлекает данные об отслеживаемых событиях из файла дампа и записывает их в файл протокола трассировки.
trcnm Генерирует список имен ядра для команды trcrpt. Этот список формируется из таблицы имен и таблицы имен загрузчика для объектного файла. С помощью файла имен ядра команда trcrpt выполняет преобразование адресов при создании отчета на основе файла протокола трассировки.
Прим.: Вместо опции trcnm рекомендуется указывать опцию -n trace. Тогда список имен будет сохранен в файле протокола трассировки, а не в отдельном файле, и будет содержать имена из расширений ядра.
trcrpt Формирует отчеты об отслеживаемых событиях, занесенных в файл протокола трассировки. При вызове этой команды можно указать, какие события следует включить в отчет или, наоборот, не включать в него, а также определить формат вывода. Способ интерпретации командой trcrpt данных, относящихся к каждому событию, определяется шаблонами, хранящимися в файле /etc/trcfmt.
trcstop Прекращает трассировку системных событий.
trcupdate Обновляет шаблоны форматирования трассировки в файле /etc/trcfmt. При добавлении новых приложений или расширений ядра, регистрирующих события трассировки, в файл /etc/trcfmt необходимо добавить шаблоны для этих событий. Шаблоны форматирования трассировки определяют способ интерпретации данных, относящихся к каждому событию, в команде trcrpt. Программные продукты, выполняющие регистрацию событий, обычно запускают команду trcupdate во время установки.

Вызовы и функции трассировщика

Трассировщик включает в себя следующие вызовы и функции:

Функция Описание
trcgen, trcgent

Регистрирует наступление отслеживаемых событий в виде записей, состоящих более чем из пяти слов данных. С помощью функции trcgen можно записать информацию о событии в канал трассировки системных событий (канал 0) или в канал трассировки общего назначения (каналы 1-7). Номер канала передается в качестве параметра функции при записи информации о событии. Функция trcgent добавляет к данным о событии текущее системное время. При работе с AIX 5L версии 5.3 с технологическим уровнем обслуживания 5300-05 и выше системное время всегда добавляется к данным события независимо от применяемой функции. При работе с ядром следует применять функции trcgenk и trcgenkt. При программировании на языке C всегда следует применять макрокоманды TRCGEN и TRCGENK.

utrchook, utrchook64 Регистрирует наступление отслеживаемых событий в виде записей, состоящих не более чем из пяти слов данных. Эти функции позволяют записать информацию о событии в канал трассировки системных событий (канал 0). При программировании ядра можно использовать функции trchook и trchook64. При программировании на языке C всегда следует применять макрокоманды TRCHKL0 - TRCHKL5 и TRCHKL0T - TRCHKL5T.

Если эти макрокоманды не используются, то необходимо создать собственное слово с данными о событии трассировки. Соответствующий формат описан в файле /etc/trcfmt. Учтите, что слова с информацией о событии 32-разрядной и 64-разрядной трассировки отличаются.

trcoff Приостанавливает регистрацию отслеживаемых событий в канале трассировки системных событий (канал 0) или в канале трассировки общего назначения (каналы 1-7). При этом канал трассировки остается активным. Возобновить регистрацию событий можно с помощью функции trcon.
trcon Запускает регистрацию отслеживаемых событий в канале трассировки системных событий (канал 0) или в канале трассировки общего назначения (каналы 1-7). Однако канал трассировки необходимо предварительно активизировать с помощью команды trace или функции trcstart. Приостановить регистрацию событий можно с помощью команды trcoff.
trcstart Библиотечный интерфейс команды trace. Возвращает номер канала запускаемой трассировки. Трассировка общего назначения может быть запущена в каналах 1,2,3,4,5,6 и 7. В иных случаях номер канала равен 0.
trcstop Освобождает и дезактивирует канал трассировки общего назначения.

Файлы трассировщика

Файл Описание
/etc/trcfmt Содержит шаблоны форматирования трассировки, с помощью которых команда trcrpt определяет способ интерпретации данных, относящихся к каждому событию.
/var/adm/ras/trcfile Это файл протокола трассировки по умолчанию. В команде trace можно указать другое имя файла протокола трассировки.
/usr/include/sys/trchkid.h Содержит определения идентификаторов точек трассировки.
/usr/include/sys/trcmacros.h Содержит набор часто применяемых макроопределений для регистрации отслеживаемых событий.

Записи о событиях трассировки

Формат данных о событиях трассировки описан в файле /etc/trcfmt.

Идентификаторы точек трассировки

Идентификатор точки трассировки представляет собой трех- или четырехзначное шестнадцатеричное число, соответствующее отслеживаемому событию. В версиях, более ранних, чем AIX 7.1, а также в 32-разрядных приложениях под AIX 7.1 и выше, могут применяться только трехзначные идентификаторы точки трассировки. При использовании макросов трассировки, таких как TRCHKL1, точка трассировки определяется следующим образом:
hhh00000
где hhh - идентификатор точки трассировки.
В 64-разрядных приложениях и процедурах ядра под AIX 7.1 и выше можно использовать трех- и четырехзначные идентификаторы. При использовании макросов трассировки, таких как TRCHKL1, точка трассировки определяется следующим образом:
hhhh0000
где hhhh - идентификатор точки трассировки.
Прим.: Если используется четырехзначный идентификатор, и он меньше, чем 0x1000, то наименьшая по значимости цифра должна быть 0 (в форме 0x0hh0).

Трехзначный идентификатор имеет 0 в качестве наименьшей цифры. Таким образом, 32-разрядный идентификатор точки трассировки hhh равен 64-разрядному идентификатору hhh0.

Большинство идентификаторов точек трассировки определены в файле /usr/include/sys/trchkid.h. В пользовательских 64-разрядных приложениях могут применяться значения в диапазоне 0x010-0x0FF. В пользовательских 32-разрядных приложениях могут применяться значения в диапазоне 0x010-0x0FF. Все остальные значения зарезервированы для системных целей. Список определенных в данный момент идентификаторов точек трассировки можно просмотреть с помощью команды trcrpt -j.

Каналы трассировки общего назначения

Трассировщик может поддерживать до восьми активных сеансов трассировки одновременно. Каждый сеанс трассировки работает с отдельным каналом специального файла мультиплексной трассировки /dev/systrace. Канал 0 служит для регистрации системных событий. Трассировка системных событий запускается командой trace и завершается командой trcstop. При трассировке отдельных процессов или нитей, а также при трассировке программ используется только канал 0. Каналы 1-7 называются каналами трассировки общего назначения и могут использоваться подсистемами для трассировки других событий, например, событий передачи данных.

Для инициализации канала трассировки общего назначения подсистема вызывает функцию trcstart, которая активизирует канал трассировки и возвращает его номер. После этого модули подсистемы могут регистрировать события с помощью макрокоманд TRCGEN и TRCGENT, либо, при необходимости, с помощью функций trcgen, trcgent, trcgenk и trcgenkt. Номер канала, возвращаемый функцией trcstart, должен передаваться в эти функции в числе прочих параметров. Подсистема может приостановить регистрацию с помощью функции trcoff, возобновить ее с помощью функции trcon и деактивировать канал трассировки с помощью функции trcstop. Для активизации и деактивизации трассировки в подсистеме должен быть предусмотрен пользовательский интерфейс.

Каналы трассировки работают с общими идентификаторами точек трассировки, большая часть которых хранится в файле /usr/include/sys/trchkid.h, и шаблонами форматирования трассировки, хранящимися в файле /etc/trcfmt.