Jak używać strace do monitorowania wywołań systemu Linux

Opublikowany: 2022-01-29
Stylizowane okno terminala na laptopie.
fatmawati achmad zaenuri/Shutterstock.com

Programy linuksowe proszą jądro, aby zrobiło dla nich pewne rzeczy. Polecenie strace ujawnia te wywołania systemowe. Możesz ich użyć, aby zrozumieć, jak działają programy i dlaczego czasami tak nie jest.

Jądro i wywołania systemowe

Choć mogą być mądre, programy komputerowe nie mogą zrobić wszystkiego dla siebie. Muszą składać wnioski, aby wykonać dla nich określone funkcje. Żądania te trafiają do jądra Linuksa. Zazwyczaj istnieje biblioteka lub inny interfejs programowy, który wywołuje program, a następnie biblioteka wysyła odpowiednie żądanie — zwane wywołaniem systemowym — do jądra.

Możliwość zobaczenia wywołań systemowych, które program wykonał i jakie były odpowiedzi, może pomóc ci zrozumieć wewnętrzne działanie programów, które cię interesują lub które napisałeś. To właśnie robi strace . Może pomóc w rozwiązywaniu problemów i wyszukiwaniu wąskich gardeł.

To nie to samo, co debugowanie aplikacji za pomocą narzędzia takiego jak gdb . Program do debugowania pozwala badać wewnętrzne działanie programu podczas jego działania. Pozwala przejść przez logikę programu i sprawdzić pamięć i wartości zmiennych. Dla porównania, to, co robi strace , to przechwytywanie informacji o wywołaniu systemowym podczas działania programu. Kiedy śledzony program kończy działanie, strace wyświetla informacje o wywołaniu systemowym w oknie terminala.

Wywołania systemowe zapewniają wszelkiego rodzaju funkcje niskopoziomowe, takie jak operacje odczytu i zapisu na plikach, zabijanie procesów i tak dalej. Na stronie podręcznika syscalls znajduje się lista setek wywołań systemowych.

POWIĄZANE: Debugowanie za pomocą GDB: Pierwsze kroki

Instalowanie strace

Jeśli strace nie jest jeszcze zainstalowany na Twoim komputerze, możesz go bardzo łatwo zainstalować.

W Ubuntu użyj tego polecenia:

 sudo apt install strace 

W Fedorze wpisz to polecenie:

 sudo dnf zainstaluj strace 

Na Manjaro polecenie to:

 sudo pacman -Sy strace 

Pierwsze kroki z strace

Użyjemy małego programu, aby zademonstrować strace . Niewiele robi: otwiera plik i zapisuje do niego wiersz tekstu, i nie ma w nim żadnego sprawdzania błędów. To tylko szybki hack, dzięki czemu mamy coś do wykorzystania ze strace .

 #włącz <stdio.h>

int main(int argc, char argv[]) { 

  // uchwyt pliku 
  PLIK *plikGeek;

  // otwórz plik o nazwie "strace_demo.txt" lub utwórz go 
  fileGeek = fopen("strace_demo.txt", "w");

  // zapisz tekst do pliku 
  fprintf(fileGeek, "Zapisz to do pliku" );

  // zamknij plik 
  fclose(fileGeek);

  // wyjdź z programu 
  powrót (0); 

} // koniec głównego

Zapisaliśmy to w pliku o nazwie „file-io.c” i skompilowaliśmy za pomocą gcc w plik wykonywalny o nazwie stex , nazwany od „ przykładu st race”.

 gcc -o stex plik-io.c

strace z wiersza poleceń i przekażemy do niego nazwę naszego nowego pliku wykonywalnego jako proces, który chcemy śledzić. Równie łatwo moglibyśmy prześledzić dowolne polecenie Linuksa lub dowolny inny plik wykonywalny binarny. Korzystamy z naszego malutkiego programu z dwóch powodów.

Pierwszym powodem jest to, że strace jest gadatliwe. Wyjście może być bardzo duże. To świetnie, gdy używasz strace w gniewie, ale na początku może to być przytłaczające. W naszym małym programie jest ograniczone wyjście strace . Drugim powodem jest to, że nasz program ma ograniczoną funkcjonalność, a kod źródłowy jest krótki i prosty. Ułatwia to zidentyfikowanie, które sekcje danych wyjściowych odnoszą się do różnych części wewnętrznego działania programu.

 strace ./stex 

Widzimy wyraźnie, że wywołanie systemowe write wysyła tekst „Write this to the file” do naszego otwartego pliku oraz wywołanie systemowe exit_group . Powoduje to zakończenie wszystkich wątków w aplikacji i wysłanie zwracanej wartości z powrotem do powłoki.

Filtrowanie danych wyjściowych

Nawet przy naszym prostym programie demonstracyjnym jest całkiem sporo danych wyjściowych. Możemy użyć opcji -e (wyrażenie). Przekażemy nazwę wywołania systemowego, które chcemy zobaczyć.

 strace -e napisz ./stex 

Reklama

Możesz zgłosić wiele wywołań systemowych, dodając je jako listę oddzieloną przecinkami. Nie umieszczaj żadnych spacji na liście wywołań systemowych.

 strace -e zamknij, napisz ./stex 

Wysyłanie wyjścia do pliku

Zaletą filtrowania wyjścia jest również problem z filtrowaniem wyjścia. Widzisz to, o co prosiłeś, ale nie widzisz nic więcej. A niektóre z tych innych danych wyjściowych mogą być dla Ciebie bardziej przydatne niż te, o które prosiłeś.

Czasami wygodniej jest uchwycić wszystko, przeszukać i przewinąć cały zestaw wyników. W ten sposób przypadkowo nie wykluczysz niczego ważnego. Opcja -o (wyjście) pozwala wysłać dane wyjściowe z sesji strace do pliku tekstowego.

 strace -o trace-output.txt ./stex 

Następnie możesz użyć polecenia less , aby przewinąć listę i wyszukać wywołania systemowe — lub cokolwiek innego — według nazwy.

 mniej trace-output.txt 

Możesz teraz użyć wszystkich funkcji wyszukiwania less , aby zbadać wyniki.

POWIĄZANE: Jak używać mniej poleceń w systemie Linux

Dodawanie znaczników czasu

Do wyniku możesz dodać kilka różnych sygnatur czasowych. Opcja -r (względne znaczniki czasu) dodaje znaczniki czasu, które pokazują różnicę czasu między początkiem każdego kolejnego wywołania systemowego. Zauważ, że te wartości czasu będą obejmować czas spędzony w poprzednim wywołaniu systemowym i wszystko inne, co program robił przed następnym wywołaniem systemowym.

 strace -r ./stex 

Reklama

Sygnatury czasowe są wyświetlane na początku każdego wiersza danych wyjściowych.

Aby zobaczyć ilość czasu spędzonego w każdym wywołaniu systemowym, użyj opcji -T (czasy syscall). Pokazuje czas spędzony wewnątrz każdego wywołania systemowego.

 strace -T ./stex 

Czasy trwania są pokazane na końcu każdej linii wywołania systemowego.

Aby zobaczyć czas wywołania każdego wywołania systemowego, użyj opcji -tt (bezwzględne znaczniki czasu). Pokazuje czas „zegara ściennego” z rozdzielczością mikrosekundową.

 strace -tt ./stex 

Czasy są wyświetlane na początku każdej linii.

Śledzenie uruchomionego procesu

Jeśli proces, który chcesz śledzić, jest już uruchomiony, nadal możesz dołączyć do niego strace . Aby to zrobić, musisz znać identyfikator procesu. Aby to znaleźć, możesz użyć ps z grep . Mamy uruchomionego Firefoksa. Aby znaleźć identyfikator procesu firefox , możemy użyć ps i przepuścić go przez grep .

 ps -e | grep firefox 

Reklama

Widzimy, że identyfikator procesu to 8483. Użyjemy opcji -p (identyfikator procesu), aby poinformować strace , do którego procesu ma się przyłączyć. Pamiętaj, że musisz użyć sudo :

 sudo strace -p 8483 

Zobaczysz powiadomienie, że strace dołączyło się do procesu, a następnie wywołania śledzenia systemowego będą wyświetlane w oknie terminala jak zwykle.

Tworzenie raportu

Opcja -c (tylko podsumowanie) powoduje, że strace drukuje raport. Generuje tabelę zawierającą informacje o wywołaniach systemowych, które zostały wykonane przez śledzony program.

 strace -c ./stex 

Kolumny to:

  • % czasu : Procent czasu wykonywania, który został wykorzystany w każdym wywołaniu systemowym.
  • sekundy : Całkowity czas wyrażony w sekundach i mikrosekundach spędzonych w każdym wywołaniu systemowym.
  • usecs/call : średni czas w mikrosekundach spędzonych na każdym wywołaniu systemowym.
  • wywołania : Liczba wykonanych wywołań systemowych.
  • błędy : liczba niepowodzeń dla każdego wywołania systemowego.
  • syscall : nazwa wywołania systemowego.

Te wartości pokażą zera dla trywialnych programów, które szybko się wykonują i kończą. Rzeczywiste wartości są pokazywane dla programów, które robią coś bardziej znaczącego niż nasza aplikacja demonstracyjna.

Głębokie wglądy w łatwy sposób

Dane wyjściowe strace mogą pokazać, które wywołania systemowe są wykonywane, które są wykonywane wielokrotnie i ile czasu wykonania zajmuje kod po stronie jądra. To świetna informacja. Często, gdy próbujesz zrozumieć, co dzieje się w twoim kodzie, łatwo jest zapomnieć, że twój plik binarny prawie bez przerwy wchodzi w interakcję z jądrem, wykonując wiele jego funkcji.

Używając strace , widzisz pełny obraz.

POWIĄZANE: Najlepsze laptopy z systemem Linux dla programistów i entuzjastów