Nie ufaj procesowi. Sprawdź, co mówi jądro.

– Mądrość z debuggera

Czym jest strace? – Plotkarz jądra systemu

strace (system call trace) to potężne narzędzie, które przechwytuje i wyświetla wywołania systemowe (system calls) wykonywane przez proces. Każda interakcja procesu z systemem operacyjnym – np. “otwórz plik”, “zapisz dane”, “połącz się przez sieć”, “zmień katalog” – to właśnie system call. strace zapisuje je wszystkie, pokazując Ci dokładną sekwencję zdarzeń.

Podstawowe użycie: Słuchamy, co proces mówi jądru

# Śledź wywołania systemowe NOWO uruchomionego programu

strace -f ./moj_program

# Dołącz do JUŻ ISTNIEJĄCEGO procesu (podaj jego PID, np. 12345)

strace -p 12345

# Zapisz całe wyjście `strace` do pliku (żeby potem na spokojnie analizować)

strace -o output.txt ./program

# Podsumuj statystyki wywołań systemowych (ile razy, jaki czas)

strace -c ./program

Najważniejsze flagi: Bądź precyzyjny w śledztwie!

Wyjście strace może być gigantyczne. Naucz się filtrować to, co naprawdę Cię interesuje.

# Śledź TYLKO wybrane wywołania systemowe (np. `open`, `read`, `write`)

strace -e trace=open,read,write ./program

# Śledź TYLKO wywołania związane z siecią (np. `socket`, `connect`, `accept`, `sendto`, `recvfrom`)

strace -e trace=network ./program

# Śledź TYLKO wywołania związane z plikami (np. `open`, `close`, `stat`, `read`, `write`)

strace -e trace=file ./program

# Pokaż czas wywołania (z dokładnością do sekundy)

strace -t ./program

# Pokaż czas wywołania (z dokładnością do mikrosekund) – super precyzja!

strace -tt ./program

# Śledź również procesy potomne (`-f` jak follow forks) – absolutnie niezbędne przy złożonych programach

strace -f ./program

UWAGA: strace BARDZO spowalnia procesy (nawet 10-100 razy)! Używaj go OSTROŻNIE na systemach produkcyjnych i tylko na krótki czas. To narzędzie diagnostyczne, a nie do stałego monitoringu!

Rozumienie wyjścia strace: Czytaj między wierszami (system calls)!

Typowe wyjście strace wygląda tak:

open("/etc/passwd", O_RDONLY)            = 3
read(3, "root:x:0:0:root:/root:/bin/bash\n", 1024) = 42
write(1, "Hello\n", 6)                   = 6
exit_group(0)                            = ?
+++ exited with 0 +++
  • open, read, write – to nazwy wywołań systemowych.
  • (“/etc/passwd”, O_RDONLY) – to argumenty przekazane do wywołania (np. ścieżka do pliku, tryb otwarcia).
  • = 3 – to wartość zwracana przez wywołanie (np. deskryptor pliku, liczba odczytanych bajtów, kod błędu).

Praktyczne przykłady: Od problemu do rozwiązania (lub wykrycia zagrożenia)!

Debugowanie “permission denied”: Dlaczego nie mam dostępu?!

Kiedy program krzyczy “Permission denied”, ale nie wiesz, którego pliku to dotyczy, strace pokaże Ci dokładną ścieżkę.

strace -e openat,access ./moj_program 2>&1 | grep -i denied

To śledzi próby otwarcia (openat) i sprawdzenia dostępu (access) do plików, a następnie filtruje te, które zwróciły błąd “denied”.

Co program robi z siecią?: Czy ktoś tu dzwoni do domu?

Idealne, gdy podejrzewasz, że program komunikuje się z internetem bez Twojej wiedzy.

strace -e trace=network -f ./program

To pokaże Ci każde socket, connect, sendto, recvfrom i inne wywołania sieciowe.

Ile czasu zajmują wywołania?: Optymalizacja w pigułce!

Flaga -c daje fajne podsumowanie, które system calls są najbardziej “kosztowne”.

strace -c -f ./program
# Wynik (przykład):

# % time     seconds  usecs/call     calls    errors syscall

# ------ ----------- ----------- --------- --------- ----------------

#  50.00    0.001000          100        10           read  <- ten `read` zajmuje 50% czasu

#  30.00    0.000600           60         5           write

#  20.00    0.000400           40         3           open

Znajdź pliki konfiguracyjne: Gdzie on trzyma swoje sekrety?

strace -e open,openat program 2>&1 | grep conf

To pokaże Ci wszystkie próby otwarcia plików, które zawierają “conf” w nazwie.

Reverse shell detection: Polowanie na intruza!

Jeśli podejrzewasz reverse shell, strace może go zdemaskować.

# Szukaj wywołań `connect()` w podejrzanym procesie (np. PID 12345)

strace -e trace=connect -p 12345

# Śledź wywołania sieciowe i plikowe dla podejrzanego procesu (`-f` pamiętaj!)

strace -e trace=network,file -f <nazwa_lub_sciezka_procesu>

Podsumowanie: strace to Twój najlepszy przyjaciel w opresji!

strace to absolutna podstawa w debugowaniu niskopoziomowym i analizie bezpieczeństwa. Gdy “nic nie działa”, “coś się sypie” albo “podejrzewam malware” – strace mówi dlaczego i co.

Kluczowe punkty do zapamiętania:

  • strace śledzi wywołania systemowe (system calls) – to, co proces komunikuje z jądrem.
  • Używaj flag -e trace=kategoria do filtrowania wyników.
  • Flaga -f (follow forks) jest kluczowa dla śledzenia procesów potomnych.
  • Pamiętaj o spowolnieniu procesu – używaj z umiarem na produkcji.
  • Zapisuj wyniki do pliku (-o), żeby spokojnie je analizować.
# Twój nowy zestaw do super-diagnostyki:

strace -c -f <polecenie_lub_PID>