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