Jeśli chodzi o wykonywanie takich zadań, jądro Linuksa zapewnia takie funkcje, jak ptrace do debugowania i diagnozowania procesów.
W tym artykule omówiono, jak używać narzędzia strace do śledzenia, monitorowania i debugowania procesów współdziałających z jądrem.
Co to są wywołania systemowe?
Zanim porozmawiamy o tym, jak używać strace, musisz zrozumieć, czego szukamy i jak one działają. Oznacza to, że powinniśmy przejść przez podstawy wywołań systemu Linux.
Wywołanie systemowe to metoda programowa, dzięki której program może zażądać usługi z jądra systemu. To jest proces, którego użyjemy do sprawdzenia działań między procesami użytkownika a jądrem Linuksa.
Za każdym razem, gdy użytkownik wykonuje program, który wykonuje odczyt, zapis, zabicie, wyjście, powiązanie itp., żądanie, wykonują wywołanie systemowe. Istnieje szeroki zakres wywołań systemowych używanych przez programy do wykonywania różnych zadań, takich jak praca w sieci, odczytywanie i zapisywanie plików, inicjowanie i kończenie procesów oraz wiele innych.
Pomyśl o wywołaniach systemowych jak o funkcjach — zachowują się podobnie — ponieważ mogą przyjmować argumenty i zwracać wartości. Główna różnica między wywołaniami systemowymi a normalnym działaniem polega na tym, że wywołania systemowe mogą bezpośrednio wchodzić w interakcje z jądrem. Wywołania systemowe używają a mechanizm pułapki nawigować między przestrzenią użytkownika a jądrem.
W systemie Linux mechanizm ten jest dobrze ukryty przed użytkownikami przez biblioteki takie jak Glibc.
UWAGA: Wywołania systemowe i interakcje jądra to znacznie więcej niż to, o czym mówiliśmy w tym samouczku. Więcej informacji można znaleźć na stronach podręcznika.
https://linkfy.do/wywołania systemowe
https://linkfy.do/trapmanual
Jak zainstalować strace w systemie Linux
Chociaż narzędzia strace nie są domyślnie preinstalowane w głównych dystrybucjach Linuksa, są one dostępne w większości oficjalnych repozytoriów tych dystrybucji; możesz go łatwo zainstalować za pomocą domyślnych menedżerów pakietów.
UWAGA: Chociaż nie będziemy omawiać, jak zainstalować strace na wszystkich systemach, omówimy, jak to zrobić z głównymi menedżerami pakietów, takimi jak apt, dnf, pacman i yum
1: Instalacja Debiana (apt)
Zainstaluj strace za pomocą polecenia:
apt-get install strace -y2: Rodzina RedHat (dnf i mniam)
Aby zainstalować strace za pomocą menedżera pakietów yum, wpisz polecenie:
mniam zainstaluj straceW przypadku menedżera pakietów dnf wprowadź polecenie:
dnf zainstalować strace3: Arch Linux (pacman)
Dla użytkowników Arch Linux możesz zainstalować strace za pomocą polecenia:
pacman -S straceTeraz, gdy masz już zainstalowane i uruchomione strace, możemy przejść dalej i nauczyć się, jak używać
Podstawowe użycie Strace: poradnik
Omówmy podstawowe użycie strace i zrozumiemy podstawowe dane wyjściowe polecenia oraz sposób, w jaki możemy z niego korzystać.
UWAGA: Dane wyjściowe strace, takie jak nazwy wywołań systemowych, odpowiadające im argumenty i wartości zwracane, są obsługiwane przez standardowy deskryptor pliku błędów (stderr).
Podstawowym sposobem użycia strace jest wywołanie narzędzia strace, po którym następuje nazwa programu, którego zachowanie chcemy zrozumieć.
Oto przykład tego przy użyciu polecenia ls:
łał! To dużo danych wyjściowych dla prostego polecenia, takiego jak ls.
Chociaż nie możemy omówić wszystkich danych wyjściowych z polecenia strace, możemy destylować i rozumieć jego znaczenie.
Jeśli weźmiesz pod uwagę pierwszą linię w powyższym wyjściu, zauważysz następujące cechy:.
- Nazwa wywołania systemowego
- Argumenty przekazywane do wywołania systemowego ujęte w nawiasy.
- Wartość zwracana z wywołania systemowego
Stąd w pierwszym wierszu wywołanie systemowe to execve (wykonaj program przy użyciu określonej tablicy argumentów), argumenty wywołania systemowego to („/bin/ls”, [„ls”, „/”], 0x7fffc4b277a8 / * 13 vars */) i zwracana wartość 0.
https://linkfy.do/wykonać
Wywołania systemowe execve wykonują plik binarny, którego chcemy użyć, w tym przypadku znajdujący się w (/bin/ls), a tablica argumentów jest ścieżką, którą chcemy wyświetlić zawartość.
Zauważysz również notację z ukośnikiem i gwiazdką. Dla naszego przykładu:
/* 13 wars */Powyższe dane wyjściowe wskazują liczbę zmiennych dodanych w wyniku wywołania procesu. Dostęp do środowiska wewnątrz funkcji execv uzyskuje się za pomocą zmiennej zewnętrznej environ zdefiniowanej jako:
int main(int argc, char *argv[], char *envp[])Ostatecznym wynikiem jest wartość zwracana, która w tym przypadku wynosi 0.
Zauważysz również, że większość linii wyjścia strace ma podobny wzorzec, który omówiliśmy powyżej.
Jak śledzić określone wywołania systemowe
Chociaż strace podaje wiele informacji dotyczących wywołań systemowych programów, większość instancji będzie prosić o filtrowanie określonych wywołań systemowych. Aby to zrobić, przekazujemy flagę -e do polecenia strace, po której następuje nazwa wywołania systemowego, którego potrzebujemy.
Co powiesz na odczytywanie wywołań systemowych dla polecenia ls?. Na przykład:
strace -e przeczytaj ls
Zauważysz, że wyświetla tylko odczytane wywołania systemowe.
Wywołanie systemowe read przyjmuje trzy argumenty: deskryptor pliku, bufor i liczbę bajtów. Wywołanie systemowe odczytuje następnie liczbę bajtów z przekazanego argumentu deskryptora pliku do bufora.
https://linkfy.do/odczytaj wywołanie systemowe
Podsumowanie wywołań systemowych
Strace pozwala nam również uzyskać podsumowanie wywołań systemowych wykonanych przez proces. Przekazując argument -c lub -summary-only, możemy uzyskać wynik taki jak ten pokazany poniżej:
Polecenie filtruje i porządkuje dane wyjściowe wydajniej niż normalne dane wyjściowe strace. Aby uzyskać zarówno podsumowanie, jak i normalne wyjście strace, przekaż argument -C.
Jak korzystać ze Strace w uruchomionych procesach
Innym razem będziesz potrzebować śladu trwającego procesu. Do tego momentu używaliśmy tylko jednego polecenia strace. Aby prześledzić działający proces, możemy użyć argumentu -p, po którym następuje proces o identyfikatorze procesu (PID), aby dołączyć do niego strace.
Możesz uzyskać PID działającego procesu, używając top i grep, ps, htop, pidof lub innych narzędzi do monitorowania systemu.
Na przykład, aby uzyskać PID procesu Apache, możemy użyć:
ps -ax | grep-i apache2Powinno to dać PID procesu apache2 (w tym przypadku PID 3514) i możemy go użyć do dołączenia go do strace.
Powinno to wyświetlić wynik podobny do pokazanego poniżej.
Strace będzie stale śledzić dołączony proces i wyświetlać dane wyjściowe, gdy dołączony proces wykonuje wywołania systemowe. Aby zakończyć śledzenie, naciśnij CTRL + C, co odłącza proces od strace.
Jak zapisać wyjście strace w plikach
Możemy również przekierować wyjście strace do pliku jako argument. Używając flagi -o, a następnie ścieżki pliku jako argumentu, możemy zapisać logi strace.
Na przykład:
strace -p 3514 -o ~/Desktop/apache_tracePo zapisaniu pliku możesz go później monitorować i analizować.
Wniosek
W tym przewodniku dowiedzieliśmy się, jak zainstalować i używać strace w głównych dystrybucjach Linuksa. Teraz, gdy rozumiesz już wywołania systemowe i sposób działania procesów, możesz użyć strace do monitorowania i debugowania uruchomionego procesu systemowego.
Koncepcje poznane w tym samouczku są bardzo przydatne, głównie dlatego, że możesz wykorzystać to, czego się nauczyłeś, do monitorowania, czy ktoś manipuluje procesami systemowymi.