ΠΠΈΠΊΠΎΡΠΈΡΡΠ°Π½Π½Ρ SystemTap Π·Ρ ΡΡΠ°ΡΠΈΡΠ½ΠΈΠΌΠΈ Π·ΠΎΠ½Π΄Π°ΠΌΠΈ PHP DTrace
Π£ Π΄Π΅ΡΠΊΠΈΡ Π΄ΠΈΡΡΡΠΈΠ±ΡΡΠΈΠ²Π°Ρ Linux ΠΌΠΎΠΆΠ½Π° Π²ΠΈΠΊΠΎΡΠΈΡΡΠΎΠ²ΡΠ²Π°ΡΠΈ ΡΡΠΈΠ»ΡΡΡ ΡΡΠ°ΡΡΠ²Π°Π½Π½Ρ SystemTap Π΄Π»Ρ Π²ΡΠ΄ΡΡΠ΅ΠΆΠ΅Π½Π½Ρ ΡΡΠ°ΡΠΈΡΠ½ΠΈΡ Π·ΠΎΠ½Π΄ΡΠ² DTrace. ΠΠ°Π½ΠΈΠΉ Π²Π°ΡΡΠ°Π½Ρ Π΄ΠΎΡΡΡΠΏΠ½ΠΈΠΉ Ρ 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