STRACE(1) | General Commands Manual | STRACE(1) |
strace - śledź wywołania systemowe i sygnały
strace [ -dffhiqrtttTvxx ] [ -akolumna ] [ -ewyraż ] ... [ -oplik ] [ -ppid ] ... [ -srozmiarnapisu ] [ -uużytkownik ] [ komenda [ arg ... ] ]
strace -c [ -ewyraż ] ... [ -Owydatki ] [ -Ssortuj ] [ komenda [ arg ... ] ]
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.
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.
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.
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.
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.
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 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:
Prosimy o pomoc w aktualizacji stron man - więcej informacji można znaleźć pod adresem http://sourceforge.net/projects/manpages-pl/.
96/02/13 |