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 ./programNajważ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 ./programUWAGA: 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 deniedTo ś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 ./programTo 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 openZnajdź pliki konfiguracyjne: Gdzie on trzyma swoje sekrety?
strace -e open,openat program 2>&1 | grep confTo 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>