Przejdź do głównej zawartości

strace


strace służy do monitorowania wywołań systemowych i sygnałów wykonywanych przez procesy. Pokazuje nazwy syscalls, argumenty, wartości zwrotne, kody błędów errno, a opcjonalnie także znaczniki czasu i stosy wywołań. Umożliwia uruchomienie programu pod kontrolą strace lub podpięcie się do już działającego procesu.

  • Typowe zastosowania: debugowanie „dlaczego coś nie działa”, analiza IO i sieci, śledzenie błędów uprawnień i brakujących plików, profilowanie na poziomie syscalls.
  • Dostępność: większość dystrybucji Linux (pakiet strace).

Okno terminala
strace [opcje] program [argumenty]
strace [opcje] -p PID[,PID2,...]
strace -f -o plik.log [opcje] program [argumenty]
  • Warianty wywołania: uruchomienie nowego programu pod strace lub podpięcie (-p) do jednego/wielu istniejących PID-ów.
  • Wspólne przełączniki: filtry -e ..., śledzenie potomków -f, zapis do pliku -o, stempel czasu -tt/-ttt, czas trwania -T, statystyki -c.

ParametrOpis
program [argumenty]Program do uruchomienia pod kontrolą strace.
-p PID[,PID2,...]Podłącza się do procesu(ów) o wskazanym PID; wymaga uprawnień do ptrace (ten sam użytkownik lub sudo).
-fŚledzi procesy potomne (po fork/clone/vfork).
-ffW połączeniu z -o, zapisuje osobny plik per PID: plik.log.<pid>.
-o PLIKZapisuje wyjście do pliku (domyślnie na stderr).
-e trace=SETFiltr syscalls: np. -e trace=open,read,write albo grupy %file, %process, %network, %signal, %ipc, %desc, %memory. Negacja: -e trace=!futex.
-e signal=SETKtóre sygnały raportować; np. -e signal=SIGINT,SIGTERM.
-e status=SETOgranicza do wywołań o danym statusie: successful, failed, unfinished, detached.
-e read=FDSET, -e write=FDSETZrzuca bajty czytane/zapisywane na wybranych deskryptorach (wymaga sensownego -s).
-P ŚCIEŻKARaportuje tylko wywołania dotyczące podanej ścieżki (można powtarzać -P).
-s NMaksymalna długość wypisywanych ciągów/BUF (domyślnie 32).
-x, -xxWyświetla ciągi w hex (dla nie-ASCII / dla wszystkich).
-yPokazuje ścieżki skojarzone z deskryptorami plików (np. dla openat/etc/hosts).
-kDrukuje stosy wywołań jądra/użytkownika (wymaga wsparcia, np. libunwind).
-cZamiast pełnego śladu – podsumowanie statystyk syscalls (liczba, łączny czas, błędy).
`-S {timecallsname}`Sortowanie tabeli z -c.
-t, -tt, -tttZnaczniki czasu (czas, +µs, +sekundy od epoki).
-rCzas względny od poprzedniego wiersza.
-TCzas trwania każdego wywołania.
-qMniej gadatliwe komunikaty (tłumi m.in. attach/detach).
-E VAR=VAL / -E VAR-Ustawia/usuwa zmienne środowiskowe dla uruchamianego programu.

Okno terminala
# 1) Szybka diagnoza: dlaczego program nie znajduje pliku?
strace -e trace=%file -y program
# Efekt: zobaczysz wywołania open/openat/stat i brakujący path z kodem errno.
Okno terminala
# 2) Podłącz do działającego procesu i śledź IO oraz sieć
sudo strace -p 1234 -f -e trace=%file,%network -s 200 -o trace.log
# Efekt: zapis do trace.log, także dla procesów potomnych; dłuższe ciągi nie będą ucinane.
Okno terminala
# 3) Statystyki syscalls zamiast pełnego logu
strace -c ls -l /tmp
# Efekt: tabela z liczbą wywołań, łącznym czasem i błędami; przydatne do profilowania.
Okno terminala
# 4) Tylko operacje na konkretnej ścieżce (np. pliku konfiguracyjnym)
strace -e trace=%file -P /etc/hosts curl http://example.com
# Efekt: pokazuje jedynie interakcje z /etc/hosts (openat, read, close...).
Okno terminala
# 5) Pełny ślad z czasami i stosami wywołań
sudo strace -ff -o srv.log -tt -T -k -p 9876
# Efekt: pliki srv.log.<pid> z timestampami, czasem każdego syscalla i backtrace (jeśli dostępny).

  • Uprawnienia/bezpieczeństwo: Podłączanie do cudzych procesów wymaga tego samego UID lub uprawnienia CAP_SYS_PTRACE (np. przez sudo). Na niektórych systemach działa ograniczenie ptrace_scope – może być konieczna zmiana ustawień lub uruchomienie jako root.
  • Narzut i wpływ na czas: strace spowalnia proces (czasem znacząco). Do profilowania w produkcji używaj selektywnych filtrów (-e, -P) i krótkich okien obserwacji.
  • Zmienność między wersjami/jądrem: Nazwy i liczby syscalls różnią się między jądrami/architekturami. Filtry mogą wymagać aktualizacji po zmianie kernela.
  • -k i symbole: Czytelne stosy wymagają bibliotek/plików symboli (np. libunwind, pakiety -dbg), inaczej zobaczysz tylko adresy.
  • ltrace vs strace: ltrace śledzi wywołania bibliotek (użytkowych), strace – wywołania systemowe; oba narzędzia się uzupełniają.

Błąd / KomunikatPrzyczynaRozwiązanie
ptrace: Operation not permitted / strace: attach: ... EPERMBrak uprawnień do podłączenia lub polityka ptrace_scope.Uruchom jako root/sudo; upewnij się, że proces ma ten sam UID; rozważ zmianę kernel.yama.ptrace_scope (świadomie!).
strace: Can't stat 'program': No such file or directoryBłędna ścieżka do programu.Podaj pełną ścieżkę lub upewnij się, że znajduje się w $PATH.
strace: attach: ... No such processNieistniejący PID lub proces już zakończony.Sprawdź ps/pidof; podłącz się ponownie do poprawnego PID.
strace: can't open 'plik.log': Permission deniedBrak prawa zapisu do katalogu/plik istnieje bez praw.Wybierz inny katalog albo zmień uprawnienia; uruchom z sudo jeśli to celowe.
unknown syscall / brak rozpoznania nazwyStara wersja strace vs nowe syscalls/kernela.Zaktualizuj strace; ewentualnie filtruj po dostępnych nazwach lub numerach syscalli.