Библиотека сайта rus-linux.net
Руководство для начинающих пользователей SystemTap. Исследования в пространстве пользователя
Оригинал: SystemTap Beginners GuideАвторы: Don Domingo, William Cohen
Дата публикации: 20 июля 2009 г.
Перевод: А.Панин
Дата перевода: 2 октября 2014 г.
Глава 4. Исследования в пространстве пользователя
Изначально система SystemTap предназначалась для исследования событий, происходящих на уровне ядра ОС. Ввиду того, что исследование событий, происходящих в пространстве пользователя, может помочь при диагностике проблемы, в версии SystemTap 0.6 была добавлена возможность исследования процессов в пространстве пользователя. SystemTap позволяет отследить вход в функцию и выход из нее в процессе пространства пользователя, исследовать предварительно установленные маркеры в коде пространства пользователя и провести мониторинг событий, происходящих в рамках процесса пространства пользователя.
grep CONFIG_UPROBES /boot/config-`uname -r`
CONFIG_UPROBES=y
grep CONFIG_UTRACE /boot/config-`uname -r`
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.