Śledzenie wykonujących się procesów

Część I - strace/Linux
Zapoznaj się z programem strace na Linuksie. Wykonaj następujące ćwiczenia.

Zad.1a. (1 punkt - na zajęciach)
Zapoznaj się z dokumentacją polecenia strace na Linuxie.
Wymień najważniejsze według siebie opcje.

Zad.1b. (1 punkt - na zajęciach)
Napisz możliwie najprostszy program w ANSI C wyświetlający na wyjściu prosty napis, typu "Hello, world." za pomocą funkcji putc lub printf. Skompiluj i uruchom program. Następnie uruchom program za pomocą strace. Jaka funkcja została wywołana w celu wyświetlenia napisu? Wyjaśnij.

WSKAZÓWKA: zapoznaj się z listą funkcji systemowych Linuksa man syscalls

Krótki tutorial wideo o strace i ltrace:
https://www.youtube.com/watch?v=2AmP7Pse4U0

Zad.1c. (1 punkt - na zajęciach)
Za pomocą strace sprawdź jakie deskryptory plików posiada uruchomiona aplikacja wyświetlająca napis "Hello world" na ekranie.

Zad.1d. (1 punkt - na zajęciach)
Zmodyfikuj napisany program aby witał on użytkownika jego identyfikatorem symbolicznym uzyskanym jako wartość zmiennej środowiskowej LOGNAME (funkcja getenv). Ponownie uruchom program przez strace. Jaki napis został wyświetlony przez funkcję systemową? Gdzie podziało się wywołanie getenv?

Uruchom tę wersję programu przez ltrace i porównaj z wynikami z strace. Czym różnią się otrzymane wyniki? Jak można jednocześnie śledzić wywołania funkcji systemowych (tak jak strace) i funkcji bibliotecznych (ltrace)? Jaki wniosek można sformułować odnośnie śledzenia wykonywanych programów?

Wskazówka: program ltrace wykorzystuje pliki konfiguracyjne i może zachowywać się różnie na różnych systemach. Wykonaj to ćwiczenie na panamincie, aby uzyskać pożądany efekt.

Zad.1e. (1 punkt - na zajęciach)
Wykorzystaj program strace do znalezienia wszystkich plików konfiguracyjnych, jakie powłoka próbuje odczytać przy starcie.
Opracuj wyrażenie z strace wskazujące WYŁĄCZNIE odczytywane pliki.

Wskazówka: zwróć uwagę, że proste wywołanie typu sh lub bash otwiera interakcyjną sesję shella, z której trzeba od razu wyjść przez exit, co jest kłopotliwe wśród potoku komunikatów strace-a. Zamiast tego lepiej jest stworzyć minimalny skrypt typu hello.sh i wywoływać shell poleceniem sh hello.sh. Wtedy shell wykonuje tylko skrypt i od razu kończy, pozwalając wyłapać wszystkie swoje akcje przez strace.

Zad.1f. (1 punkt - w domu)
Sprawdź czy plik edytowany w programie pico w czasie jego edycji jest stale otwarty.
Opracuj wyrażenie z strace potwierdzające odpowiedź na to pytanie.

Zad.1g. (1 punkt - w domu)
Wykorzystaj program strace do znalezienia błędu w poniższym programie. Jaki sygnał zabił program? Co oznacza otrzymanie tego sygnału?

#include <stdio.h>
char *napis = "Witajcie moi mili ...";
int main(){
  unsigned int index=0;
  for (;; ++index){
    printf("%c",napis[index]);
  }
  return 0;
}

Opracuj wyrażenie z strace które generuje potrzebne informacje.

Zad.1h. (1 punkt - w domu)
Jak można wykorzystać strace/ltrace do pomiaru czasu wykonania poszczególnych elementów programu? Aby przećwiczyć tę możliwość dla programu o nieznanym kodzie źródłowym uruchom kilka przykładowych istniejących w systemie programów (np. zegarek xclock, przeglądarkę firefox, itp.), i w oddzielnym okienku uruchom strace/ltrace aby śledzić działający program przez jakiś czas z zapisywaniem wyników do pliku. Po kilku/kilkunastu sekundach przerwij strace/ltrace przez control-C i w zapisanym pliku wynikowym znajdź wywołania, które zajęły najwięcej czasu. Weź pod uwagę najbardziej zrozumiały otrzymany wynik. Jaki wniosek można sformułować odnośnie analizy czasowej programów?

Prezentacja praktycznego wykorzystania strace do dynamicznej analizy czasowej działania aplikacji
https://adfinis.com/en/blog/strace-performance-analysis/

Część II - truss/Solaris
Zapoznaj się z programem truss (man truss) na Solarisie, w szczególności z opcjami takimi jak: -r, -s, -t, -u, -w. Naucz się filtrować informacje dostarczane przez truss za pomocą powyższych opcji.
Wykonaj poniższe ćwiczenia, i opracuj odpowiednie wyrażenia wykorzystujące truss generujące precyzyjnie wyłącznie informacje potrzebne do odpowiedzenia na zadane pytania.

Zad.2a. (1 punkt - na zajęciach)
Napisz możliwie najprostszy program w ANSI C wyświetlający na wyjściu prosty napis, typu "Hello, world." za pomocą funkcji putc lub printf. Skompiluj i uruchom program. Następnie uruchom program za pomocą truss. Jaka funkcja została wywołana w celu wyświetlenia napisu?

Zad.2b. (1 punkt - w domu)
Za pomocą programu truss zidentyfikuj oraz zlokalizuj wszystkie pliki konfiguracyjne, które powłoka bash próbuje odczytać przy starcie.
Opracuj wyrażenie z truss

Zad.2c. (1 punkt - w domu)
Za pomocą programu truss zlicz liczbę wywołań funkcji printf, które wykonuje program ls uruchomiony w Twoim katalogu.

Zad.2d. (1 punkt - w domu)
Za pomocą programu truss prześledź w jaki sposób edytor tekstu (np. pico) postępuje z edytowanym plikiem? Czy plik ten jest otwarty przez cały czas działania edytora?