Утилита strace в Linux


Утилита strace в Linux позволяет отслеживать системные вызовы. Это основной способ выяснить почему скрипт выполняется не так как ожидается и единственный способ позволяющий выяснить это не заглядывая в исходный код.



Использование утилиты strace в Linux и strace php


Что позволяет делать strace:


  • отслеживать системные вызовы
  • искать баги в коде без доступа к нему и без знания языка программирования на котором он написан
  • понять как работает файловая система — как биты и байты организуются в привычные фйлы
  • наблюдать за работой сети уровня TCP/IP
  • видеть как процессы работают с памятью


Любая запускаемая программа, любой скрипт и процесс постоянно выполняет системные вызовы

Основные вызовы:

  1. open
  2. read
  3. write
  4. connect
  5. sendto
  6. recv from


При помощи strace можно отслеживать любой процесс — например, ls, выводящий имена файлов в директории



cd /tmp

strace ls



Фрагмент вывода в консоль при выполнении команды приведен на скриншоте:

strace в Linux


Весь вывод значительно более объемный. В нём видно какие системные библиотеки и файлы вызываются и какие запросы выполняются.



Применительно к 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.

Читайте также про управление процессами.

Сказать спасибо