NAZWA¶
strace - śledź wywołania systemowe i sygnały
SKŁADNIA¶
strace [
-dffhiqrtttTvxx ] [
-akolumna ] [
-ewyraż ] ... [
-oplik ] [
-ppid ] ... [
-srozmiarnapisu ] [
-uużytkownik ] [
komenda [
arg ... ] ]
strace -c [
-ewyraż ] ... [
-Owydatki ] [
-Ssortuj ] [
komenda [
arg ... ] ]
OPIS¶
Uwaga! To tłumaczenie może być nieaktualne!
W najprostszym przypadku,
strace wykonuje zadaną komendę
`
komenda' aż się ona nie skończy. Strace przechwytuje i
nagrywa wywołania systemowe, dokonane przez proces, oraz sygnały,
które do niego dotarły. Nazwa każdego wywołania, oraz jego
argumenty, są wypisywane na wyjście standardowe błędu, lub
do pliku podanego w opcji
-o.
strace jest użytecznym narzędziem diagnostyki, debuggowania.
Administratorzy systemów, diagnostycy i napotykacze problemów
zauważą, że jest nieocenione dla rozwiązywania
problemów z programami, których źródeł nie ma wprost
dostępnych. Strace bowiem nie potrzebuje rekompilacji aby go
użyć. Studenci, hackerzy i ogólnie zainteresowani
zauważą, że z śledzenia wywołań systemowych
można się wiele nauczyć o systemie. Programiści
zauważą, że skoro wywołania systemowe i sygnały
są zdarzeniami zachodzącymi na interfejsie
użytkownik/jądro, to ich bliska obserwacja może być bardzo
użyteczna do izolowania błędów, sprawdzania czystości
i próbowania wyłapywania ulotnych warunków.
Każda śledzona linia zawiera nazwę wywołania systemowego, za
którą następują jego argumenty, otoczone nawiasami, oraz
jego wartość zwracana. Przykładowe śledzenie komendy ``cat
/dev/null'' daje:
open("/dev/null", O_RDONLY) = 3
Do błędów (zwykle wartości zwracane -1) dopisywany jest
symbol errno i napis błędu.
open("/foo/bar", O_RDONLY) = -1 ENOENT (No such file or directory)
Sygnały są drukowane jako symbol, oraz napis sygnału. Fragment
śledzenia i przerwania komendy ``sleep 666'' to:
sigsuspend([] <unfinished ...>
--- SIGINT (Interrupt) ---
+++ killed by SIGINT +++
Argumenty są namiętnie drukowane w formie symbolicznej. Przykład
ten pokazuje dokonanie przekierowania ``>>xyzzy'':
open("xyzzy", O_WRONLY|O_APPEND|O_CREAT, 0666) = 3
Tutaj, wymienione trzy argumenty z open są zdekodowane poprzez rozbicie
argumentu flagi na jego bitowe składniki i wydrukowanie ich tradycyjnych
nazw, oraz wartości ósemkowej praw. Choć tradycyjne, lub
natywne używanie różni się od ANSI lub POSIX, to te
ostatnie formy są jednak preferowane. W niektórych wypadkach,
wyjście strace może być bardziej czytelne niż
źródła.
Wskaźniki struktury są dereferencjonowane, a członkowie są
odpowiednio wyświetlani. We wszystkich wypadkach argumenty są
formatowane w stylu C. Na przykład, istota komendy ``ls -l /dev/null''
jest przechwytywana jako:
lstat("/dev/null", {st_mode=S_IFCHR|0666, st_rdev=makedev(1, 3), ...}) = 0
Zauważ, jak zdereferencjonowano argument `struct stat' i jak
wyświetlono każdego członka. Praktycznie, zauważ jak
ostrożnie został zdekodowany członek st_mode na jego maskę
bitową. Zauważ też, że w tym przykładzie, pierwszym
argumentem lstat jest wejście wywołania systemowego, a drugim jego
wyjście. Ponieważ argumenty wyjściowe nie są modyfikowane
jeśli wywołanie zawiedzie, argumenty nie zawsze mogą
zostać zdereferencjonowane. Na przykład próba ``ls -l'' na
nieistniejącym pliku da następującą linię:
lstat("/foo/bar", 0xb004) = -1 ENOENT (No such file or directory)
Wskaźniki znakowe są dereferencjonowane i wyświetlane jako napisy
C. Niedrukowalne znaki są reprezentowane w kodach eskejpowych.
Drukowanych jest tylko pierwszych
rozmiarnapisu (domyślnie 32)
bajtów napisu; dłuższe napisy mają za zamykającym
cytatem dołączone wielokropki. Oto przykład ``ls -l'', gdzie
funkcja biblioteki getpwuid odczytuje plik z hasłem:
read(3, "root::0:0:System Administrator:/"..., 1024) = 422
Podczas gdy struktury są notowane przy użyciu nawiasów
klamrowych, zwykłe wskaźniki i tablice są drukowane przy
użyciu nawiasów kwadratowych, z przecinkami oddzielającymi
elementy. Oto przykład wywołania komendy ``id'' na systemie z
dodatkowymi id grup:
getgroups(32, [100, 0]) = 2
Z drugiej strony, zbiory bitowe też są pokazywane w nawiasach
kwadratowych, lecz elementy są oddzielane tylko przez spację. Oto
powłoka, przygotowująca się do wywołania komendy
zewnętrznej:
sigprocmask(SIG_BLOCK, [CHLD TTOU], []) = 0
Drugi argument jest zbiorem bitowym dwóch sygnałów, SIGCHLD i
SIGTTOU. W niektórych wypadkach, zbiory bitowe są tak pełne,
że bardziej sensowne jest drukowanie nieustawionych elementów. W
takiej sytuacji zbiór jest poprzedzony tyldą, jak w
następującym przykładzie:
sigprocmask(SIG_UNBLOCK, ~[], NULL) = 0
Drugi argument wskazuje, że ustawiono cały zestaw sygnałów.
OPCJE¶
- -c
- Zliczaj czas, wywołania i błędy dla
każdego wywołania systemowego i zgłoś na końcu
raport.
- -d
- Przekaż na stderr wyjście debuggowe
strace.
- -f
- Śledź procesy potomne, tworzone prze obecnie
śledzone procesy, jako rezultat wywołania systemowego fork(2).
Nowe procesy są dołączane tak szybko, jak szybko zostaje
uzyskany ich pid (poprzez wartość zwracaną fork(2) w
procesie rodzicielskim). Oznacza to, że takie dzieci mogą na
chwilę być niekontrolowane (szczególnie w wypadku
vfork(2)), aż rodzic nie zostanie znów wyshedulowany do
dokończenia wywołania (v)fork(2). Jeśli rodzic zdecyduje
zaczekać (wait(2)) na dziecko, które obecnie jest śledzone,
zostaje on zawieszony aż potomek się nie zakończy.
- -ff
- opcja -o nazwapliku będzie
działać, śledzenie każdego procesu jest zapisywane do
nazwapliku.pid, gdzie pid jest numerycznym identyfikatorem
procesu.
- -F
- Na SunOS 4.x opcja ta powoduje próbę
podążania za vforkami poprzez triki dynamicznego linkowania. W
przeciwnym wypadku, vforki nie będą śledzone, nawet z
podaną opcją -f.
- -h
- Wydrukuj podsumowanie pomocy.
- -i
- Drukuj podczas wywołania systemowego wskaźnik
instrukcji.
- -q
- Zahamuj komunikaty o przyłączaniu,
odłączaniu, etc. Dzieje się to automatycznie gdy
wyjście jest przekierowywane do pliku, a komenda jest wykonywana
bezpośrednio, zamiast przyłączania.
- -r
- Drukuj względny timestamp podczas każdego
wywołania systemowego. Nagruwa to różnicę czasu
między początkami kolejnych wywołań systemowych.
- -t
- Poprzedź każdą linię trace czasem
dnia.
- -tt
- Jeśli podane dwukrotnie, wydrukowany czas
włącza mikrosekundy.
- -ttt
- Jeśli podane trzykrotnie, wydrukowany czas
włącza mikrosekundy, a prowadząca porcja będzie
zawierać liczbę sekund od epoki.
- -T
- Pokaż czas spędzony na wywołaniach
systemowych. Nagrywa to różnice czasowe między
początkiem i końcem każdego wywołania
systemowego.
- -v
- Drukuj nieskrócone wersje wywołań
environment, stat, termios, itp. Struktury te są wspólne w
wywołaniach, więc domyślne zachowanie wyświetla
rozsądny podzbiór członków. Gdy uzyjesz tej opcji,
wyświetlone zostanie wszystko.
- -V
- Wydrukuj numer wersji strace.
- -x
- Drukuj wszystkie niedrukowalne napisy w formacie
szesnastkowym.
- -xx
- Drukuj wszystkie napisy w formacie szesnastkowym.
- -a kolumna
- Justuj zwracane wartości w konkretnej kolumnie
(domyślnie 40).
- -e wyraż
- Wyrażenie kwalifikujące, określające
które zdarzenia śledzić, lub jak je śledzić.
Formatem wyrażenia jest:
[kwalifikator=][!]wartość1[,wartość2]...
gdzie kwalifikator jest jednym z trace, abbrev, verbose, raw, signal, read,
lub write, a wartość jest zależnaym od kwalifikatora
symbolem, lub liczbą. Domyślnym kwalifikatorem jest trace
(śledź). Użycie wykrzyknika neguje zbiór
wartości. Na przykład -eopen oznacza -e trace=open, co z kolei
oznacza, by śledzić tylko wywołania systemowe open.
Odwrotnie, -etrace=!open oznacza, by śledzić wszystkie
wywołania poza wywołaniami open. Dodatkowo, istnieją
specjalne wartości all (wszystko) i none (nic).
Zauważ, że niektóre powłoki używają wykrzyknika
dla rozszerzenia histori; nawet wewnątrz cytowanych argumentów.
Jeśli tak będzie, musisz wyeskejpować wykrzyknik odwrotnym
ukośnikiem.
- -e trace=zbiór
- Śledź tylko podany zbiór wywołań
systemowych. Opcja -c jest użyteczna dla określania,
które wywołania systemowe mogą być użyteczne do
śledzenia. Na przykład trace=open,close,read,write oznacza, by
śledzić tylko te cztery wywołania systemowe. Uważaj z
wyciąganiem wniosków o ramce użytkownik/jądro
jeśli monitorujesz tylko podzbiór używanych
wywołań systemowych. Domyślnie, trace=all.
- -e trace=file
- Śledź wszystkie wywołania systemowe,
które biorą nazwę pliku jako argument. Możesz
myśleć o tym jak o skrócie dla -e
trace=open,stat,chmod,unlink,... co może być użyteczne
dla sprawdzenia, które pliki są ważne dla procesu. Co
więcej, użycie skrótu zapewni, że przypadkiem nie
zapomnisz dołączyć wywołania w rodzaju
lstat.
- -e trace=process
- Śledź wszystkie wywołania systemowe,
które zajmują się zarządzaniem procesami. Jest to
przydatne do obserwowania kroków fork, wait i exec procesu.
- -e trace=network
- Śledź wszystkie wywołania związane z
siecią.
- -e trace=signal
- Śledź wszystkie wywołania związane z
sygnałami.
- -e trace=ipc
- Śledź wszystkie wywołania związane z
IPC.
- -e abbrev=zbiór
- Skróć wyjście przez niedrukowanie
każdego członka dużych struktur. Domyślnie abbrev=all.
Opcja -v ma efekt abbrev=none.
- -e verbose=zbiór
- Dereferencjuj struktury podanego zestawu wywołań
systemowych. Domyślnie jest verbose=all.
- -e raw=zbiór
- Drukuj czyste, niezdekodowane argumenty podanych
wywołań systemowych. Opcja te powoduje, że wszystkie
argumenty są drukowane szesnastkowo. Jest to najbardziej
użyteczne, jeśli nie ufasz dekodowaniu, lub jeśli
potrzebujesz znać właściwe wartości numeryczne
argumentów.
- -e signal=zbiór
- Śledź tylko podany zbiór sygnałów.
Domyślnie jest signal=all. Na przykład signal=!SIGIO (lub
signal=!io) powoduje, że sygnały SIGIO nie będą
śledzone.
- -e read=zbiór
- Dokonuj zrzutów szesnastkowych i ascii wszystkich
danych odczytywanych z deskryptorów podanych w zbiorze. Na
przykład, by zobaczyć co dzieje się na wejściu
deskryptorów 3, 5, użyj: -e read=3,5. Zauważ,
że jest to niezależne od normalnego śledzenia
wywołania read, które jest kontrolowane opcją -e
trace=read.
- -e write=zbiór
- Dokonuj zrzutów szesnastkowych i ascii wszystkich
danych zapisywanych do deskryptorów podanych w zbiorze. Na
przykład, by zobaczyć co dzieje się na wyjściu
deskryptorów 3, 5, użyj: -e write=3,5. Zauważ,
że jest to niezależne od normalnego śledzenia
wywołania write, które jest kontrolowane opcją -e
trace=write.
- -o nazwapliku
- Zapisuj wyjście śledzenia do pliku
nazwapliku, a nie na standardowy błąd. Użyj
nazwapliku.pid jeśli użyto opcji -ff. Jesli
argument zaczyna się od `|' lub od `!', reszta argumentu traktowana
jest jak komenda i całe wyjście jest do niej przesyłane.
Jest to przydatne dla przekierowywania wyjścia debuggowego, nie
dotykając przekierowań normalnego wyjścia programu.
- -O wydatki
- Ustaw wydatki na śledzenie wywołań
systemowych na wydatki mikrosekund. Jest to użyteczne dla
przeciążenia domyślnej heurystyki dla zgadywania ile czasu
jest spędzanego na czystym mierzeniu podczas timingowaniu
wywołań systemowych przy użyciu opcji -c.
Dokładność heurystyki może być ocenione przez
timingowanie danego programu bez śledzenia i porównanie
zebranego czasu wywołań systemowych do całkowitego,
wydanego przy użyciu -c .
- -p pid
- Podwieś się do procesu o podanym identyfikatorze
ID pid i rozpocznij śledzenie. Śledzenie
może być zakończone w dowolnym momencie przez przerwanie z
klawiatury (CTRL-C). strace odpowie przez
odwieszenie się od śledzonego procesu(ów),
pozostawiając go (je) w spokoju. Do podwieszenia się do
kolejnych 32 procesów, można używać wielu opcji
-p, jako uzupełnienie komendy komenda (która jest
opcjonalna, jeśli podano przynajmniej jedną opcję
-p).
- -s wielkośćnapisu
- Podaj maksymalną długość drukowanego
napisu (domyślnie 32). Zauważ, że nazwy plików nie
są uważane za napisy i zawsze są drukowane w
całości.
- -S sortuj
- Sotruj wyjściowy histogram opcji -c według
podanego kryterium. Legalnymi wartościami są time, calls, name,
i nothing (domyślne to time).
- -u użytkownik
- Uruchom komendę z userid i groupid, oraz dodatkowymi
grupami użytkownika. Opcja ta jest użyteczna tylko
podczas pracy z roota i umożliwia właściwe wywołanie
binariów z ustawionymi sgid/suid. Bez tej opcji, programy suid/sgid
są wywoływane bez efektywnych przywilejów.
INSTALACJA SETUID¶
Jeśli
strace jest zainstalowane z suid root, to użytkownik
wywołujący będzie mógł się
podłączyć i śledzić procesy dowolnego innego
użytkownika. Dodatkowo, programy suid i sgid będą
wywoływane i śledzonez właściwymi efektywnymi
przywilejami. Ponieważ robić to powinni tylko zaufani
użytkownicy z przywilejami roota, takie instalowanie
strace ma
sens tylko, jeśli użytkownicy uprawnieni do jego wywoływania
mają odpowiednie przywileje. Na przykład sensowne jest instalowanie
specjalnej wersji
strace z prawami `rwsr-xr--', dla użytkownika
root i grupy trace, gdzie członkowie grupy trace są zaufanymi
osobami. Jeśli używasz tej właściwości, pamiętej
by zainstalować niesuidowaną wersję strace dla zwykłych
luserów.
ZOBACZ TAKŻE¶
ptrace(2),
proc(4),
time(1),
trace(1),
truss(1)
UWAGI¶
Szkoda, że w systemach z bibliotekami dzielonym jest produkowanych tyle
śmieci podczas śledzenia.
Jest dobrze myśleć o wejściach i wyjściach wywołań
systemowych jak o przepływie danych między przestrzenią
użytkownika i jądra. Ponieważ przestrzeń użytkownika
i przestrzeń jądra są oddzielone granicą ochrony
adresów, można czasem wyciągać wnioski dedukcyjne o
zachowaniu procesu na podstawie wartości wejścia i wyjścia.
W niektórych wypadkach wywołanie systemowe może
różnić się od udokumentowanego zachowania, lub mieć
inną nazwę. Na przykład na systemach zgodnych z System V,
rzeczywiste wywołanie
time(2) nie pobiera argumentu, a funkcja stat
nazywana jest xstat i bierze dodatkowy argument. Różnice te są
normalne, lecz uczulone charakterystyki interfejsu wywołań
systemowych są obsługiwane przez wrappery biblioteki C.
Na niektórych platformach proces, który ma załączone
śledzenie wywołań systemowych z opcją
-p otrzyma
SIGSTOP. Sygnał ten może przerwać wywołanie
systemowe, które nie jest restartowalne. Może to mieć
nieprzewidziane efekty na procesie, jeśli proces nie podejmuje
działań do restartowania wywołania systemowego.
BŁĘDY¶
Programy, które używają bitu
setuid nie będą
miały efektywnych uprawnień użytkownika podczas śledzenia.
Śledzony proces ignoruje
SIGSTOP (poza platformami SVR4).
Śledzony proces, próbujący zablokować SIGTRAP otrzyma
SIGSTOP w próbie kontynuacji śledzenia.
Śledzony program działa powoli.
Śledzone procesy, które schodzą z komendy
komenda
mogą zostać pozostawione po sygnale przerwania
(
CTRL-C).
Pod Linuksem, śledzenie procesu init jest zabronione.
Opcja
-i jest słabo wspierana.
HISTORIA¶
strace Oryginalny strace został napisany przez Paula Kranenburga dla
SunOS, który został zinspirowany narzędziem trace. Wersja SunOS
strace została przeniesiona na Linuksa i rozszerzona przez Branko
Lankestera, który również napisał wsparcie jądra
Linuksa. Mimo, że Paul w 1992 wypuścił wersję 2.5 strace,
prace Branko opierały się na strace 1.5 z 1991. W 1993 Rick Sladkey
połączył zmiany strace 2.5 z SunOS ze zmianami wersji
linuksowej, dodał wiele właściwości z truss'a z SVR4 i
wydał wersję strace, która działała na obydwu
platformach. W 1994 Rick przeportował strace na SVR4 i Solaris, oraz
napisał wsparcie automatycznej konfiguracji. W 1995 przeportował
strace na Irixa i zmęczył się pisaniem o sobie w trzeciej
osobie.
PROBLEMY¶
Problemy związane ze
strace powinny być zgłaszane do
obecnego opiekuna
strace, którym jest Rick Sladkey
<jrs@world.std.com>.
Powyższe tłumaczenie pochodzi z nieistniejącego już Projektu
Tłumaczenia Manuali i
może nie być aktualne. W razie
zauważenia różnic między powyższym opisem a
rzeczywistym zachowaniem opisywanego programu lub funkcji, prosimy o
zapoznanie się z oryginalną (angielską) wersją strony
podręcznika za pomocą polecenia:
- man --locale=C 1 strace
Prosimy o pomoc w aktualizacji stron man - więcej informacji można
znaleźć pod adresem
http://sourceforge.net/projects/manpages-pl/.