strace 1






STRACE(1) STRACE(1)


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
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, debuggowa
nia. 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, sprawdza
nia 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'':



96/02/13 1





STRACE(1) STRACE(1)


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ą jed
nak 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 argu
mentem lstat jest wejście wywołania systemowego, a drugim
jego wyjście. Ponieważ argumenty wyjściowe nie są mody
fikowane 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 rozmiar
napisu (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 sys
temie z dodatkowymi id grup:

getgroups(32, [100, 0]) = 2

Z drugiej strony, zbiory bitowe też są pokazywane w naw
iasach 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



96/02/13 2





STRACE(1) STRACE(1)


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łedy 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 sys
temowego fork(2). Nowe procesy są dołączane
tak szybko, jak szybko zostaje uzyskany ich
pid (poprzez wartość zwracaną fork(2) w proce
sie 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 nazwap
liku.pid, gdzie pid jest numerycznym identy
fikatorem 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ń



96/02/13 3





STRACE(1) STRACE(1)


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 syste
mowych. Nagrywa to różnice czasowe między
początkiem i końcem każdego wywołania syste
mowego.

-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 uzy
jesz tej opcji, wyświetlone zostanie wszystko.

-V Wydrukuj numer wersji strace.

-x Drukuj wszystkie niedrukowalne napisy w forma
cie szesnastkowym.

-xx Drukuj wszystkie napisy w formacie szes
nastkowym.

-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ć. For
matem 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 sym
bolem, 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 rozsz
erzenia histori; nawet wewnątrz cytowanych argumentów.
Jeśli tak będzie, musisz wyeskejpować wykrzyknik odwrotnym
ukośnikiem.



96/02/13 4





STRACE(1) STRACE(1)


-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 wszys
tkie 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 sig
nal=!io) powoduje, że sygnały SIGIO nie będą



96/02/13 5





STRACE(1) STRACE(1)


ś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 pod
czas 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



96/02/13 6





STRACE(1) STRACE(1)


(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 sen
sowne 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 pro
dukowanych tyle śmieci podczas śledzenia.

Jest dobrze myśleć o wejściach i wyjściach wywołań syste
mowych 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 pro
cesu 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 bib
lioteki C.




96/02/13 7





STRACE(1) STRACE(1)


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 restar
towania wywołania systemowego.

BŁĘDY
Programy, które używają bitu setuid nie będą miały efekty
wnych 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 Linuxem, śledzenie procesu init jest zabronione.

Opcja -i jest słabo wspierana.

HISTORIA
strace Oryginalny strace został napisany przez Paula Kra
nenburga dla SunOS, który został zinspirowany narzędziem
trace. Wersja SunOS strace została przeniesiona na Linuxa
i rozszerzona przez Branko Lankestera, który również
napisał wsparcie jądra Linuxa. 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 linuxowej, 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 przepor
tował 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 obec
nego opiekuna strace, którym jest Rick Sladkey
<jrs@world.std.com>.













96/02/13 8





Wyszukiwarka

Podobne podstrony:
Reakcje Strąceniowe klasa II gimnazjum
miareczkowanie strąceniowe
Neuroshima Wyscig Rajd Stracencow
2009 06 Bug Bumper Get Started with Strace and Debug Faster
2009 08 Dig Deep Debugging with Strace
Miareczkowanie potencjometryczne strąceniowe VI
Chemia analityczna miareczkowanie strąceniowe
Reakcje strąceniowe
Pohl, podstawy chemii analitycznej, ROZDZIELANIE STRĄCENIOWE
Bolter Nic do stracenia

więcej podobnych podstron