strace

Autres langues

Langue: pl

Autres versions - même langue

Version: 96/02/13 (openSuse - 09/10/07)

Section: 1 (Commandes utilisateur)

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, 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>.