Provided by: manpages-pl_20051117-1_all bug

NAZWA

       strace - śledź wywołania systemowe i sygnały

SKŁADNIA

       strace  [ -dffhiqrtttTvxx ] [ -akolumna ] [ -ewyra ] ...  [ -oplik ] [
       -ppid ] ...  [ -srozmiarnapisu ] [ -uuytkownik ] [ 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=zbir
              Ś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=zbir
              Skróć wyjście przez niedrukowanie każdego członka  dużych
              struktur.    Domyślnie  abbrev=all.  Opcja  -v  ma  efekt
              abbrev=none.

       -e verbose=zbir
              Dereferencjuj   struktury   podanego   zestawu    wywołań
              systemowych. Domyślnie jest verbose=all.

       -e raw=zbir
              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=zbir
              Ś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=zbir
              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=zbir
              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 wielkonapisu
              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 uytkownik
              Uruchom  komendę  z  userid  i  groupid, oraz dodatkowymi
              grupami  uytkownika.   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>.

                                   96/02/13                          STRACE(1)