strace

Śledzi wywołania systemowe i sygnały odbierane przez proces.

strace to jedno z tych narzędzi, które zamieniają magiczne „program nie działa i nie wiem czemu” w konkretną odpowiedź. Śledzi wywołania systemowe (syscalls) i sygnały, jakie proces wymienia z jądrem Linuksa — czyli każde otwarcie pliku, połączenie sieciowe, odczyt, zapis czy próbę dostępu do zasobu. Kiedy aplikacja wywala się bez sensownego komunikatu, wisi w miejscu albo nie widzi jakiegoś pliku, strace pokaże Ci dokładnie, na czym się wykłada — najczęściej na jakimś ENOENT albo EACCES, których nikt nie zalogował.

Składnia i najważniejsze opcje

strace [opcje] [polecenie | -p PID]

  • -p PID — podłącza się do już działającego procesu o danym PID (Ctrl+C odłącza, nie zabija).
  • -f — śledzi też procesy potomne tworzone przez fork, vfork i clone. Niezbędne przy shellach, serwerach i wszystkim wielowątkowym.
  • -e trace=... — filtruje, co śledzić, np. -e trace=open,openat albo -e trace=network. Zapis -e trace=!open wyklucza dane wywołanie.
  • -o plik — zapisuje trace do pliku zamiast wypluwać wszystko na standardowe wyjście błędów.
  • -c — zamiast pełnego logu daje podsumowanie: ile razy wywołano każdy syscall, ile błędów i ile czasu zjadł.
  • -T — dopisuje czas spędzony w każdym wywołaniu systemowym (świetne do polowania na to, co muli).
  • -t — dokleja znacznik czasu do każdej linii (podwojone -tt dodaje mikrosekundy).
  • -s ROZMIAR — ile znaków ciągu pokazać (domyślnie ucina długie; podnieś, gdy chcesz zobaczyć całą treść zapisu).
  • -y — przy deskryptorach plików dopisuje ścieżki, do których się odnoszą.

Przykłady użycia

  • strace ls /tmp — uruchamia ls i pokazuje pełną listę syscalli, jakie wykonuje. Dobry pierwszy strzał, żeby zobaczyć, jak to w ogóle wygląda.
  • strace -p 1234 -f — podpina się do żywego procesu 1234 wraz z jego dziećmi. Idealne, gdy demon wisi i nie wiesz, na czym.
  • strace -e trace=openat -o /tmp/log.txt myapp — śledzi tylko otwieranie plików i zapisuje wynik do pliku. Tak znajdziesz brakujący config albo bibliotekę.
  • strace -c curl http://example.com — pomija szczegóły, daje tabelkę: które wywołania są najczęstsze i najdroższe czasowo.
  • strace -e trace=network -f nginx — filtruje wyłącznie operacje sieciowe, świetne do debugowania połączeń i bindów portów.

Częste błędy i pułapki

Zapominasz o -f — bez tego przy procesach, które forkują (bash, serwery, menedżery), zobaczysz tylko rodzica, a cała akcja dzieje się w dziecku. Klasyk marnowania pół godziny.

Podłączanie do cudzego procesu zwykle wymaga roota albo złagodzenia ptrace_scope (Ubuntu i Debian domyślnie ustawiają kernel.yama.ptrace_scope=1, więc strace -p na obcym PID rzuci Operation not permitted). Użyj sudo.

Narzut wydajnościstrace potrafi spowolnić proces kilkukrotnie, bo każdy syscall przechodzi przez dodatkowe zatrzymanie. Nie odpalaj tego na produkcyjnym demonie „na chwilę”, jeśli obsługuje ruch. Do lżejszego, ciągłego podglądu lepiej sprawdzi się bpftrace.

Powódź danych — bez -e i -o log zaleje terminal w sekundę. Filtruj od razu.

Powiązane komendy: ltrace (śledzi wywołania bibliotek, nie jądra), gdb (debugger z krokowaniem), lsof (otwarte pliki i deskryptory), perf i bpftrace (profilowanie o mniejszym narzucie).