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?