Jak śledzić wywołania systemowe wykonane przez proces ze Strace na Linux

Jak śledzić wywołania systemowe wykonane przez proces ze Strace na Linux

Są chwile, kiedy warto sprawdzić, co działa uruchomiona aplikacja pod maską, i jakie system nazywa podczas wykonania. Aby wykonać takie zadanie w Linux, możemy użyć Strace pożytek. W tym artykule zobaczymy, jak go zainstalować i poznamy jego podstawowe użycie.

W tym samouczku się nauczysz:

  • Jak zainstalować Strace
  • Jak używać Strage do śledzenia połączeń systemowych wykonanych przez proces
  • Jak filtrować wywołania systemu szczegółów
  • Jak dołączyć do już działającego procesu
  • Jak wygenerować podsumowanie połączeń systemowych
Jak śledzić wywołania systemowe wykonane przez proces ze Strace na Linux

Zastosowane wymagania i konwencje oprogramowania

Wymagania oprogramowania i konwencje linii poleceń Linux
Kategoria Wymagania, konwencje lub wersja oprogramowania
System Niezależny od rozkładu
Oprogramowanie Strace
Inny Znajomość interfejsu wiersza poleceń i zarządzania procesami Linux
Konwencje # - Linux -commands do wykonania z uprawnieniami root bezpośrednio jako użytkownik root lub za pomocą sudo Komenda
$-Linux-commands, który ma zostać wykonany jako zwykły użytkownik niepewny

Instalacja

Chociaż domyślnie nie jest zainstalowany, Strace Użyteczność jest dostępna w oficjalnych repozytoriach wszystkich głównych dystrybucji Linuksa; Oznacza to, że możemy go bardzo łatwo zainstalować za pomocą naszego ulubionego menedżera pakietów.

Jeśli działa na przykład na Fedorze (lub w jakiejkolwiek innej dystrybucji w rodzinie Red Hat), musimy użyć DNF:

$ sudo dnf instaluj strace 


Jeśli czujemy się bardziej komfortowo za pomocą dystrybucji Debiana lub Debiana, takich jak Ubuntu lub Linux Mint, możemy użyć trafny Aby osiągnąć ten sam wynik:

$ sudo apt instal instal Strace 

Jeśli Arch Linux jest naszym wyborem, możemy użyć Pacman Aby zainstalować aplikację, która jest dostępna w dodatkowy magazyn:

$ sudo pacman -s strace 

Po zainstalowanym oprogramowaniu możemy przejść do przodu i zobaczyć kilka przykładów jego użycia.

Przedstawiamy Strace

Jak już powiedzieliśmy, Strace jest narzędziem używanym do śledzenia połączeń systemowych wykonanych przez działający proces i otrzymane przez niego sygnały. Wezwania systemowe są podstawowym interfejsem między aplikacją a jądrem Linux; Kiedy używamy Strace, Nazwa połączeń wykonanych przez proces, wraz z ich argumentami i wartościami zwrotnymi są wyświetlane Stderr (Standardowy deskryptor pliku błędu).

Zobaczmy podstawowe użycie Strace, Aby zapoznać się z jego wyjściem. W swoim najbardziej podstawowym użyciu nazywamy Strace a następnie program, który chcemy wykonać i komu chcemy przeanalizować. Ze względu na ten przykład po prostu skopiujemy plik za pomocą CP Komenda:

$ strace cp ~/.Bashrc Bashrc 

Wyjście polecenia jest dość długie i oczywiście tutaj nie możemy go szczegółowo przeanalizować; Zobaczmy pierwszą linię. Każda linia w Strace Wyjście zawiera:

  • Nazwa połączeń systemowych
  • Argumenty przekazane do wywołania systemu w nawiasach
  • Wartość zwracania połączenia systemowego

Pierwsze połączenie systemowe, które możemy zobaczyć w wyjściu Execve. To połączenie służy do wykonywania programu z określoną gamą argumentów. Pierwszy argument zaakceptowany przez execv to ścieżka pliku, którą chcemy wykonać; Drugi to szereg strun, które reprezentują argumenty, które zostaną przekazane do programu (pierwszy argument, według konwencji, jest nazwą samego programu).

W naszym przypadku, zgodnie z oczekiwaniami, nazywany jest binar /usr/bin/cp, a szereg argumentów przekazanych na wezwanie to: nazwa programu (CP), źródło i ścieżki docelowe:

execve ("/usr/bin/cp", ["cp", "/home/egdoc/.bashrc ”,„ bashrc ”], 0x7fff53d4e4c0 / * 46 vars * /) = 0 

/ * 46 vars */ notacja oznacza, że ​​46 zmiennych dziedziczonych po procesie wywołania (w execv funkcja środowisko jest pobierane z zewnętrznego otaczać zmienny). Wreszcie mamy Wartość zwracana, Które w tym przypadku jest 0 (Właściwie Exec rodzina funkcji zwraca wartość tylko wtedy, gdy wystąpi błąd).

Filtrowanie tylko określonych wywołań systemowych

Podczas używania Strace Czasami możemy chcieć śledzić tylko wywołania systemu szczegółowego wykonane według procesu. W takich sytuacjach możemy użyć -mi Opcja, po której następuje wyrażenie, które wskazuje, jakie wywołania systemowe powinny zostać prześledzone. Załóżmy, że uruchamiamy to samo polecenie, którego użyliśmy w poprzednim przykładzie, ale chcemy tylko Czytać Wezwania systemowe, które mają być wyświetlane na wyjściu, uruchomilibyśmy:

$ strace -e czytaj cp ~/.Bashrc Bashrc 

Zgodnie z oczekiwaniami tylko Czytać Połączenia są zgłaszane:

Wyjście „Strace -e Read CP ~/.przy okazji polecenie bashrc bashrc ”, Czytać System Call przyjmuje trzy argumenty: Pierwszy to deskryptor pliku powiązane z plikami, które należy odczytać; Drugi to bufor w którym plik powinien być odczytany, a trzeci to liczba bajtów to należy przeczytać. Po sukcesie funkcja zwraca liczbę bajtów odczytanych z pliku, ponieważ możemy obserwować na wyjściu powyższego.

Załączanie strace w procesie działającym

Do tej pory wywołyliśmy Strace Przekazując mu polecenie, które ma zostać wykonane i utrzymanie śladu; Co jeśli chcemy prześledzić istniejący i już uruchomiony proces? W takim przypadku musimy się powołać Strace z -P (Lub --przytwierdzać) opcja i przejdź Pid (Identyfikator procesu) procesu, do którego chcemy go dołączyć.

Aby znaleźć PID programu, wśród innych rozwiązań, możemy użyć Pidof pożytek. Ze względu na ten przykład dołączymy Strace do bieżącej instancji Gnome-terminal-serwer:

$ pidof gnome-terminal-serwer 121316 


Pidof powróciło polecenie 121316, który jest PID gnom-końcowego serwera. Wiedząc o tym, możemy dołączyć Strace do procesu:

$ strace -p 121316 

Powyższe polecenie początkowo zwróci coś takiego:

Wyjście polecenia „Strace -p 121316” Powyższe (skrócone) wyjście zostanie zaktualizowane „w locie” w miarę wykonywania połączeń systemowych. Odłączyć" Strace Możemy po prostu nacisnąć Ctrl+c na klawiaturze; Zostaniemy powiadomieni o „oderwaniu”, ale prześledzony proces będzie nadal działał:
Strace: proces 121316 odłączony 

Sygnały śledzenia

Dzięki Strace Możemy również zaobserwować, kiedy proces odbiera sygnał i jak na niego reaguje. Pozwól mi to zademonstrować. Najpierw uruchamiamy długoterminowy proces szczyt, który jest monitorem procesu:

$ top 

My niż się przywiązujemy Strace do tego, po uzyskaniu PID, który w tym przypadku jest 44825:

$ strace -p 44825 

W tym momencie Strace zaczyna śledzić połączenia systemowe wykonane przez szczyt, ale także otrzymane przez niego sygnały. Aby to udowodnić Sigterm do pid 44825:

$ Kill 44825 

Zgodnie z oczekiwaniami, zdarzenie jest zgłaszane w Strace wyjście:

--- Sigterm si_signo = sigterm, si_code = si_user, si_pid = 44888, si_uid = 1000 --- 

Na powyższym wyjściu si_signo jest liczbą dostarczanego sygnału (sigter = 15), SI_CODE zawiera kod, który identyfikuje przyczynę sygnału (si_user = 0): w tym przypadku sygnał został wygenerowany przez proces użytkownika. si_pid I si_uid Raport Fields odpowiednio Pid procesu wysyłania i jego UID.

Zapisz wyjście Strace na pliku

Jeśli używamy -o opcja (skrót --OUPUT) Podczas uruchamiania Strace, Możemy przekierować jego dane wyjściowe do pliku, podając ścieżkę jako argument, na przykład:

$ strace -p 121316 -O Strace_output Strace: Process 121316 załączony 

Strace_output Plik zostanie utworzony i wyjście Strace zostanie napisane w nim. Aby obejrzeć aktualizację w pliku, możemy użyć ogon: Zwykle to polecenie odczytuje ostatnie 10 wierszy pliku i wychodzi, ale jeśli nazwiemy to z -F opcja (skrót --podążać) Możemy obserwować, ponieważ dołączono nową treść:

$ tail -f strace_output 


Wydrukuj podsumowanie wywołań systemu

Strace Narzędzie ma bardzo przydatną funkcję: możliwość wygenerowania podsumowania wszystkich wywołań systemowych wykonanych przez określony proces. Jeśli chcemy wygenerować taki raport, wszystko, co musimy zrobić, to wywołać program z -C Lub --tylko podsumowanie opcja. Weźmy jako przykład CP polecenie, których użyliśmy wcześniej:

$ strace -c cp ~/.Bashrc Bashrc 

Powyższe polecenie wygeneruje ten raport:

% czasu sekund USECS/połączenia wywołania Błędy SYSCALL ------ ----------- ----------- ---------- ---- ----- ---------------- 25.71 0.000298 7 38 13 Openat 19.24 0.000223 4 51 mmap 11.48 0.000133 4 28 Zamknij 9.92 0.000115 57 2 1 Newfstatat 7.94 0.000092 10 9 mprotect 6.99 0.000081 3 25 fstat 2.85 0.000033 3 11 Czytaj 2.76 0.000032 16 2 MunMap 2.50 0.000029 14 2 Statfs 1.90 0.000022 22 1 Napisz 1.55 0.000018 2 8 Pread64 1.38 0.000016 8 2 1 Dostęp 1.04 0.000012 4 3 brk 0.78 0.000009 4 2 RT_Sigaction 0.60 0.000007 7 1 Futex 0.52 0.000006 3 2 1 arch_prctl 0.43 0.000005 5 1 RT_SIGPROCMask 0.43 0.000005 5 1 set_tid_address 0.43 0.000005 5 1 Fadvise64 0.43 0.000005 5 1 set_robust_list 0.43 0.000005 5 1 Prlimit64 0.26 0.000003 3 1 1 Stat 0.26 0.000003 3 1 1 Lseek 0.17 0.000002 2 1 geteuid 0.00 0.000000 0 1 Execve ------ ----------- ----------- --------- --------- ---------------- 100.00 0.001159 5 196 18 

Jak widać, ponieważ wygenerowaliśmy podsumowanie, normalne wyjście Strace nie jest wyświetlany. Jeśli chcemy wygenerować podsumowanie, ale nadal uzyskać regularne wyjście programu, musimy użyć -C zamiast tego opcja, która jest krótką formą --streszczenie.

Wnioski

W tym samouczku nauczyliśmy się instalować i używać Strace, fajne narzędzie przydatne do celów debugowania, a bardziej ogólnie do śledzenia połączeń systemowych wykonywanych przez proces. Widzieliśmy, jak wyniki Strace jest zorganizowany, jak uruchomić program i śledzić połączenia systemowe, które wykonuje, jak się dołączyć Strace do już uruchomionego procesu i sposobu, w jaki sygnały otrzymywane przez proces są powiadomione; Na koniec widzieliśmy, jak wygenerować podsumowanie wszystkich połączeń wykonanych przez proces. Tutaj ledwo zarysowaliśmy powierzchnię tego, co możemy zrobić Strace: Jeśli chcesz dowiedzieć się o tym więcej, rada jest jak zawsze przeczytanie instrukcji!

Powiązane samouczki Linux:

  • Rzeczy do zainstalowania na Ubuntu 20.04
  • Rzeczy do zrobienia po zainstalowaniu Ubuntu 20.04 Focal Fossa Linux
  • Linux Pliki konfiguracyjne: Top 30 Najważniejsze
  • Wprowadzenie do automatyzacji, narzędzi i technik Linuksa
  • Rzeczy do zainstalowania na Ubuntu 22.04
  • Hung Linux System? Jak uciec do wiersza poleceń i…
  • Jak używać polecenia TCPDUMP w Linux
  • Czy Linux może uzyskać wirusy? Badanie podatności Linuksa…
  • Rzeczy do zrobienia po zainstalowaniu Ubuntu 22.04 JAMMY Jellyfish…
  • Mint 20: Lepsze niż Ubuntu i Microsoft Windows?