PHP 8.6.0 Beta 1 is available for testing

Работа средства SystemTap со статическими зондами PHP DTrace

В отдельных дистрибутивах Linux для отслеживания статических зондов DTrace доступен инструмент трассировки SystemTap. Этот вариант доступен в PHP 5.4.20 и PHP 5.5.

Установка PHP с SystemTap

Установите разработческий пакет SystemTap SDT:

# yum install systemtap-sdt-devel

Установите PHP с DTrace:

# ./configure --enable-dtrace ...
# make

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

Статические PHP-зонды выводит команда stap:

# stap -l 'process.provider("php").mark("*")' -c 'sapi/cli/php -i'

Примерный вывод:

process("sapi/cli/php").provider("php").mark("compile__file__entry")
process("sapi/cli/php").provider("php").mark("compile__file__return")
process("sapi/cli/php").provider("php").mark("error")
process("sapi/cli/php").provider("php").mark("exception__caught")
process("sapi/cli/php").provider("php").mark("exception__thrown")
process("sapi/cli/php").provider("php").mark("execute__entry")
process("sapi/cli/php").provider("php").mark("execute__return")
process("sapi/cli/php").provider("php").mark("function__entry")
process("sapi/cli/php").provider("php").mark("function__return")
process("sapi/cli/php").provider("php").mark("request__shutdown")
process("sapi/cli/php").provider("php").mark("request__startup")

Пример работы SystemTap с PHP

Пример #1 Скрипт all_probes.stp — трассировка статических PHP-зондов

probe process("sapi/cli/php").provider("php").mark("compile__file__entry") {
 printf("Probe compile__file__entry\n");
 printf(" compile_file %s\n", user_string($arg1));
 printf(" compile_file_translated %s\n", user_string($arg2));
}
probe process("sapi/cli/php").provider("php").mark("compile__file__return") {
 printf("Probe compile__file__return\n");
 printf(" compile_file %s\n", user_string($arg1));
 printf(" compile_file_translated %s\n", user_string($arg2));
}
probe process("sapi/cli/php").provider("php").mark("error") {
 printf("Probe error\n");
 printf(" errormsg %s\n", user_string($arg1));
 printf(" request_file %s\n", user_string($arg2));
 printf(" lineno %d\n", $arg3);
}
probe process("sapi/cli/php").provider("php").mark("exception__caught") {
 printf("Probe exception__caught\n");
 printf(" classname %s\n", user_string($arg1));
}
probe process("sapi/cli/php").provider("php").mark("exception__thrown") {
 printf("Probe exception__thrown\n");
 printf(" classname %s\n", user_string($arg1));
}
probe process("sapi/cli/php").provider("php").mark("execute__entry") {
 printf("Probe execute__entry\n");
 printf(" request_file %s\n", user_string($arg1));
 printf(" lineno %d\n", $arg2);
}
probe process("sapi/cli/php").provider("php").mark("execute__return") {
 printf("Probe execute__return\n");
 printf(" request_file %s\n", user_string($arg1));
 printf(" lineno %d\n", $arg2);
}
probe process("sapi/cli/php").provider("php").mark("function__entry") {
 printf("Probe function__entry\n");
 printf(" function_name %s\n", user_string($arg1));
 printf(" request_file %s\n", user_string($arg2));
 printf(" lineno %d\n", $arg3);
 printf(" classname %s\n", user_string($arg4));
 printf(" scope %s\n", user_string($arg5));
}
probe process("sapi/cli/php").provider("php").mark("function__return") {
 printf("Probe function__return: %s\n", user_string($arg1));
 printf(" function_name %s\n", user_string($arg1));
 printf(" request_file %s\n", user_string($arg2));
 printf(" lineno %d\n", $arg3);
 printf(" classname %s\n", user_string($arg4));
 printf(" scope %s\n", user_string($arg5));
}
probe process("sapi/cli/php").provider("php").mark("request__shutdown") {
 printf("Probe request__shutdown\n");
 printf(" file %s\n", user_string($arg1));
 printf(" request_uri %s\n", user_string($arg2));
 printf(" request_method %s\n", user_string($arg3));
}
probe process("sapi/cli/php").provider("php").mark("request__startup") {
 printf("Probe request__startup\n");
 printf(" file %s\n", user_string($arg1));
 printf(" request_uri %s\n", user_string($arg2));
 printf(" request_method %s\n", user_string($arg3));
}

Приведённый скрипт выводит данные статических PHP-зондов на всём протяжении работы PHP-скрипта:

# stap -c 'sapi/cli/php test.php' all_probes.stp

Нашли ошибку?

ИнструкцияИсправлениеСообщение об ошибке
+Добавить

Примечания пользователей 1 note

up
-2
idealities at gmail dot com
7 years ago
# stap -l 'process.provider("php").mark("*")' -c 'sapi/cli/php -i'
This can also be archived by:
stap -l 'process("sapi/cli/php").mark("*")'
And, no need to be root to run this command.
+Добавить

AltStyle によって変換されたページ (->オリジナル) /