Утилита strace в Linux позволяет отслеживать системные вызовы. Это основной способ выяснить почему скрипт выполняется не так как ожидается и единственный способ позволяющий выяснить это не заглядывая в исходный код.
Использование утилиты strace в Linux и strace php
Что позволяет делать strace:
- отслеживать системные вызовы
- искать баги в коде без доступа к нему и без знания языка программирования на котором он написан
- понять как работает файловая система — как биты и байты организуются в привычные фйлы
- наблюдать за работой сети уровня TCP/IP
- видеть как процессы работают с памятью
Любая запускаемая программа, любой скрипт и процесс постоянно выполняет системные вызовы
Основные вызовы:
- open
- read
- write
- connect
- sendto
- recv from
При помощи strace можно отслеживать любой процесс — например, ls, выводящий имена файлов в директории
cd /tmp
strace ls
Фрагмент вывода в консоль при выполнении команды приведен на скриншоте:
Весь вывод значительно более объемный. В нём видно какие системные библиотеки и файлы вызываются и какие запросы выполняются.
Применительно к PHP процессам
Очень часто strace используется для отладки веб-приложений, особенно на PHP. Это нужно когда какой-то код не работает, но ошибок в логи веб-сервер и интерпретатор PHP не пишут.
Есть три способа отслеживания процессов.
1) — запуская скрипт с интерпретатором
strace php index.php
2) При помощи враппера PHP, создается враппер, благодаря которому все системные вызовы пишутся в лог. Плюс здесь в том, что задействуется CGI, скрипт не выполняется вручную
3) По идентификатору процесса
ps aux | grep php
strace -p PID
PID берется из вывода последней команды
В сети можно найти информацию по любому системному вызову. PHP процессы часто могут обрабатываться медленно из-за того, что ждут ответа от стороннего API, бэкенда или базы данных.
Примеры системных вызовов, которые можно увидеть с помощью strace в Linux
write
write(1, "unity_support_test.0\n", 21unity_support_test.0) = 21
1) файловый дескриптор и значение, которое вернулось в результате предыдущего вызова
2) сам системный вызов
3) аргументы
4)количество байт записанной информации
open
open("/usr/lib/locale/locale-archive", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
open ничего не записывает, 3 в конце = это возвращаемое значение и файловый дескриптор
Что делает процесс можно посмотреть поскольку он является файлом
ls -l /proc/3/fd
Применение strace для отладки приложений
Проверить какие конфигурационные файлы используются
strace -f -e open mplayer musicfile.mp3
Можно запускать утилиту указывая, что нужны только вызовы типа write
strace -e write …
Или вызовы connect, что позволит увидеть IP адреса
strace -e connect …
Вызовы execve при выполнении скрипта script.sh
strace - -e execve ./script.sh
Другие полезные ключи strace в Linux
-f — отслеживать также все порождаемые субпроцессы
-s 800 — ограничивает количество символов в выводе
-o testfile.txt — записывает результаты в файлов
-y — выводит имена файлов вместо файловых дескрипторов
Всегда следует иметь в виду, что strace делает выполнение программ медленнее, поэтому с отслеживанием PHP процессов нагруженных систем лучше проявлять осторожность.
Мы рассмотрели основы работы с утилитой strace в Linux.
Читайте также про управление процессами.