Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

Руководство для начинающих пользователей SystemTap. Исследования в пространстве пользователя

Оригинал: SystemTap Beginners Guide
Авторы: Don Domingo, William Cohen
Дата публикации: 20 июля 2009 г.
Перевод: А.Панин
Дата перевода: 2 октября 2014 г.

Глава 4. Исследования в пространстве пользователя

Изначально система SystemTap предназначалась для исследования событий, происходящих на уровне ядра ОС. Ввиду того, что исследование событий, происходящих в пространстве пользователя, может помочь при диагностике проблемы, в версии SystemTap 0.6 была добавлена возможность исследования процессов в пространстве пользователя. SystemTap позволяет отследить вход в функцию и выход из нее в процессе пространства пользователя, исследовать предварительно установленные маркеры в коде пространства пользователя и провести мониторинг событий, происходящих в рамках процесса пространства пользователя.

Для исследования процессов из пространства пользователя системе SystemTap требуется модуль uprobes. В том случае, если вы используете ядро Linux версии 3.5 или более поздней версии, оно уже должно включать модуль uprobes. Для проверки того, поддерживает ли ваше текущее ядро ОС механизм, реализованный в рамках модуля uprobes, следует выполнить следующую команду:
grep CONFIG_UPROBES /boot/config-`uname -r`
В том случае, если механизм uprobes интегрирован в ядро ОС, вывод данной команды будет следующим:
CONFIG_UPROBES=y
Если вы используете боле раннюю версию ядра ОС, чем версия 3.5, SystemTap автоматически соберет модуль uprobes. Однако, вам также понадобятся расширения ядра utrace, которые необходимы механизму исследования процессов пространства пользователя из состава SystemTap для отслеживания различных событий в пространстве пользователя. Дополнительные подробности реализации инфраструктуры utrace доступны в wiki по адресу: http://sourceware.org/systemtap/wiki/utrace. Для того, чтобы узнать, предоставляет ли используемое в текущий момент ядро Linux необходимую поддержку механизма utrace, введите следующую команду после приглашения командной оболочки:
grep CONFIG_UTRACE /boot/config-`uname -r`
В том случае, если ядро Linux поддерживает механизм исследования процессов пространства пользователя, после исполнения данной команды будет получен следующий вывод:
CONFIG_UTRACE=y

4.1. События пространства пользователя

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

Исследования некоторых событий пространства пользователя умышленно ограничиваются рамками определенного исполняемого файла (с помощью переменной окружения PATH), так как система SystemTap должна использовать отладочную информацию для осуществления статического анализа с целью выявления точек размещения зондов. Но для исследований большинства событий пространства пользователя идентификатор процесса и имя исполняемого файла являются необязательными параметрами. Любое событие процесса (process) из списка ниже, включающее указание на идентификатор процесса или путь к исполняемому файлу, должно включать эти аргументы. Идентификатор процесса и путь к исполняемому файлу являются необязательными для событий процессов (process), в описания которых они не включены:

process("PATH").function("function")

Вход в функцию пространства пользователя с именем function для исполняемого файла, расположенного по пути PATH. Данное событие является аналогом из пространства пользователя для события kernel.function("function"). При работе с данным событием допускается использование шаблонов в имени функции function и суффикса .return.

process("PATH").statement("statement")

Наиболее ранняя инструкция в коде для выражения statement. Это аналог из пространства пользователя для события kernel.statement("statement").

process("PATH").mark("marker")

Маркер marker точки статического анализа для программного компонента, расположенного по пути PATH. Вы можете использовать шаблоны при описании маркера marker для обозначения множества точек исследования в рамках одного зонда. При работе с точками статического анализа также могут использоваться нумерованные аргументы ($1, $2 и.т.д.), доступные из зонда.

Различные пакеты пространства пользователя, такие, как Java, содержат упомянутые точки статического анализа. Большинство пакетов, предоставляющих в распоряжение пользователей точки статического анализа, также предоставляет псевдонимы для событий, соответствующих маркерам пространства пользователя. Ниже приведен пример использования одного из таких псевдонимов при исследовании виртуальной машины Java hotspot x86_64:
probe hotspot.gc_begin =
  process("/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/lib/amd64/server/libjvm.so").mark("gc__begin")
  			
process.begin

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

process.thread.begin

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

process.end

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

process.thread.end

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

process.syscall

Осуществление системного вызова процессом из пространства пользователя. Номер системного вызова будет доступен из переменной контекста $syscall, а первые шесть аргументов - из переменных из диапазона от $arg1 до $arg6. Суффикс .return позволяет отслеживать выход из системного вызова. В случае использования события syscall.return возвращаемое значение будет доступно из переменной контекста $return.

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

4.2. Получение доступа к целевым переменным в пространстве пользователя

Вы можете получить доступ к целевым переменным в пространстве пользователя таким же образом, как описывалось в Разделе 3.3.2, "Целевые переменные". В Linux, однако, существуют отдельные адресные пространства для кода пользователя и кода ядра. В случае использования оператора -> SystemTap осуществляет доступ к соответствующему адресному пространству.

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

user_char(адрес)

Получает символ (char), расположенный по заданному адресу в пространстве текущего пользовательского процесса.

user_short(адрес)

Получает короткое целочисленное значение (short int), расположенное по заданному адресу в пространстве текущего пользовательского процесса.

user_int(адрес)

Получает целочисленное значение (int), расположенное по заданному адресу в пространстве текущего пользовательского процесса.

user_long(адрес)

Получает длинное целочисленное значение (long int), расположенное по заданному адресу в пространстве текущего пользовательского процесса.

user_string(адрес)

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

user_string_n(адрес, n)

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

4.3. Обратные трассировки стека в пространстве пользователя

Функция точки исследования (pp) указывает на определенное событие, которое привело к срабатыванию обработчика события, созданного с помощью SystemTap. При активации обработчика зонда для отслеживания входа в функцию должно быть возвращено имя этой функции. Однако, во многих случаях одно и то же событие для точки исследования может быть сгенерировано разными модулями программы; это особенно актуально при использовании функций из разделяемых библиотек. Обратная трассировка стека пространства пользователя, произведенная средствами SystemTap, позволяет получить дополнительную информацию о том, как было сгенерировано событие точки исследования.

Генерация отчета об обратной трассировке стека пространства пользователя затруднена из-за того, что компилятор генерирует код, который предварительно оптимизируется с целью устранения указателей из стекового фрейма. Однако, компилятор также добавляет в секцию отладочной информации дополнительную информацию, позволяющую инструментам для отладки осуществлять обратные трассировки стека. Механизм SystemTap, предназначенный для осуществления обратных трассировок стека, использует эту отладочную информацию для обхода стека и генерации отчетов о трассировке стека для 32-битных и 64-битных процессоров архитектуры x86; при этом мы пока не реализовали возможность использования отладочной информации для других архитектур процессоров с целью осуществления трассировки стека в пространстве пользователя. Для того, чтобы убедиться в том, что необходимая отладочная информация будет использована для осуществления обратных трассировок стека в пространстве пользователя, следует использовать параметр -d исполняемый_файл для исполняемых файлов и -ldd для разделяемых библиотек.

Например, вы можете использовать функции обратной трассировки стека для ознакомления со способом вызова функции xmalloc в рамках утилиты ls. При условии установки пакета с отладочной информацией для утилиты ls, следующая команда SystemTap будет выводить отчет об обратной трассировке стека каждый раз, когда будет вызываться функция xmalloc:
stap -d /bin/ls --ldd \
-e 'probe process("ls").function("xmalloc") {print_usyms(ubacktrace())}' \
-c "ls /"

В ходе исполнения данной команды будет выведена аналогичная информация:

Для более подробного ознакомления с функциями механизма обратной трассировки стека в пространстве пользователя, обратитесь к тапсетам ucontext-symbols.stp и ucontext-unwind.stp. Вы также можете найти описания функций из упомянутых выше тапсетов в документе "Справочное руководство пользователя тапсетов SystemTap".


Следующий раздел : Глава 5. Полезные сценарии SystemTap.