strace śledzi wszystkie wywołania systemowe procesu w czasie rzeczywistym. Gdy program źle się zachowuje, a jego logi nic nie mówią, strace pokazuje dokładnie jakie pliki otwiera, jakie połączenia sieciowe próbuje nawiązać i gdzie się wysypuje.

Jak używać strace? Podstawowe zastosowania

1. Uruchamianie programu pod strace

Najprostszym sposobem użycia strace jest uruchomienie z nim dowolnego programu. strace wyświetli każde wywołanie systemowe wykonane przez ten program.

# Zobaczmy, co robi proste polecenie 'ls'
strace ls

Wynik będzie bardzo szczegółowy, ale już na pierwszy rzut oka zobaczymy wywołania takie jak openat() (otwieranie plików), read() (czytanie), write() (pisanie na standardowe wyjście) i close() (zamykanie plików).

2. Podpinanie się do działającego procesu

To najczęstszy i najbardziej użyteczny scenariusz. Jeśli masz już uruchomiony proces (np. serwer WWW, bazę danych), który sprawia problemy, możesz podpiąć się do niego za pomocą strace, podając jego identyfikator procesu (PID).

# Najpierw znajdź PID procesu (np. serwera nginx)
pidof nginx

# Załóżmy, że PID to 1234. Podpinamy się:
sudo strace -p 1234

Od tego momentu, każde wywołanie systemowe wykonane przez proces o PID 1234 zostanie wyświetlone w Twoim terminalu. Aby zakończyć, wciśnij Ctrl+C.

Praktyczne przykłady i przydatne opcje

Przykład: Program nie może znaleźć pliku

Wyobraź sobie, że program moj-program przy starcie zgłasza błąd “nie można otworzyć pliku konfiguracyjnego”, ale nie mówi, gdzie go szuka. Użyjmy strace, aby się tego dowiedzieć. Będziemy filtrować tylko wywołania związane z otwieraniem plików (openat).

strace -e trace=openat moj-program

Na wyjściu zobaczysz coś w stylu:

openat(AT_FDCWD, "/etc/moj-program.conf", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/home/user/.config/moj-program.conf", O_RDONLY) = -1 ENOENT (No such file or directory)

Teraz dokładnie wiesz, w jakich lokalizacjach program szukał swojego pliku konfiguracyjnego i dlaczego go nie znalazł.

Inne przydatne opcje strace

  • -o <plik>: Zapisuje wynik do pliku zamiast na ekran.
    sudo strace -p 1234 -o /tmp/strace.log
    
  • -f: Śledzi również wszystkie procesy potomne (forks/clones). Bardzo ważne przy analizie złożonych aplikacji, jak serwery WWW.
  • -t: Pokazuje czas wykonania każdego wywołania.
  • -s <rozmiar>: Określa maksymalną długość wyświetlanych ciągów znaków (domyślnie skracane).
  • -e trace=<zestaw>: Filtruje wywołania do konkretnego zestawu. Przykłady:
    • trace=file: Tylko wywołania związane z plikami (open, read, write, close).
    • trace=network: Tylko wywołania sieciowe.
    • trace=process: Tylko wywołania związane z zarządzaniem procesami.

Filtrowanie z -e trace= i zapis do pliku z -o sprawia, że strace jest praktyczny nawet na obciążonych procesach produkcyjnych.