Strace w Linuxie — jak śledzić wywołania systemowe
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.