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
).
Składnia
Dział zatytułowany „Składnia”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
.
Parametry
Dział zatytułowany „Parametry”Parametr | Opis | ||
---|---|---|---|
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 ). | ||
-ff | W połączeniu z -o , zapisuje osobny plik per PID: plik.log.<pid> . | ||
-o PLIK | Zapisuje wyjście do pliku (domyślnie na stderr). | ||
-e trace=SET | Filtr syscalls: np. -e trace=open,read,write albo grupy %file , %process , %network , %signal , %ipc , %desc , %memory . Negacja: -e trace=!futex . | ||
-e signal=SET | Które sygnały raportować; np. -e signal=SIGINT,SIGTERM . | ||
-e status=SET | Ogranicza do wywołań o danym statusie: successful , failed , unfinished , detached . | ||
-e read=FDSET , -e write=FDSET | Zrzuca bajty czytane/zapisywane na wybranych deskryptorach (wymaga sensownego -s ). | ||
-P ŚCIEŻKA | Raportuje tylko wywołania dotyczące podanej ścieżki (można powtarzać -P ). | ||
-s N | Maksymalna długość wypisywanych ciągów/BUF (domyślnie 32). | ||
-x , -xx | Wyświetla ciągi w hex (dla nie-ASCII / dla wszystkich). | ||
-y | Pokazuje ścieżki skojarzone z deskryptorami plików (np. dla openat → /etc/hosts ). | ||
-k | Drukuje stosy wywołań jądra/użytkownika (wymaga wsparcia, np. libunwind). | ||
-c | Zamiast pełnego śladu – podsumowanie statystyk syscalls (liczba, łączny czas, błędy). | ||
`-S {time | calls | name}` | Sortowanie tabeli z -c . |
-t , -tt , -ttt | Znaczniki czasu (czas, +µs, +sekundy od epoki). | ||
-r | Czas względny od poprzedniego wiersza. | ||
-T | Czas trwania każdego wywołania. | ||
-q | Mniej gadatliwe komunikaty (tłumi m.in. attach/detach). | ||
-E VAR=VAL / -E VAR- | Ustawia/usuwa zmienne środowiskowe dla uruchamianego programu. |
Przykłady użycia
Dział zatytułowany „Przykłady użycia”# 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.
# 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.
# 3) Statystyki syscalls zamiast pełnego logustrace -c ls -l /tmp# Efekt: tabela z liczbą wywołań, łącznym czasem i błędami; przydatne do profilowania.
# 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...).
# 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. przezsudo
). Na niektórych systemach działa ograniczenieptrace_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
vsstrace
:ltrace
śledzi wywołania bibliotek (użytkowych),strace
– wywołania systemowe; oba narzędzia się uzupełniają.
Najczęściej spotykane błędy i jak je naprawić
Dział zatytułowany „Najczęściej spotykane błędy i jak je naprawić”Błąd / Komunikat | Przyczyna | Rozwiązanie |
---|---|---|
ptrace: Operation not permitted / strace: attach: ... EPERM | Brak 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 directory | Błędna ścieżka do programu. | Podaj pełną ścieżkę lub upewnij się, że znajduje się w $PATH . |
strace: attach: ... No such process | Nieistniejący PID lub proces już zakończony. | Sprawdź ps /pidof ; podłącz się ponownie do poprawnego PID. |
strace: can't open 'plik.log': Permission denied | Brak 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 nazwy | Stara wersja strace vs nowe syscalls/kernela. | Zaktualizuj strace ; ewentualnie filtruj po dostępnych nazwach lub numerach syscalli. |
Linki i źródła
Dział zatytułowany „Linki i źródła”- man strace – oficjalna dokumentacja.
- Projekt strace – strona główna, wydania i przewodniki.
- Repozytorium GitHub: strace/strace – źródła i zgłoszenia błędów.