Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ truss(1) — Reliant UNIX 5.44c4

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

ps(1)

signal(5)

truss(1)                                                           truss(1)

NAME
     truss - Systemaufrufe und Signale protokollieren

SYNTAX
     truss [option ...] kommando

BESCHREIBUNG
     truss führt das angegebene Kommando aus und protokolliert mit, welche
     Systemaufrufe das Kommando tätigt, welche Signale es empfängt und wel-
     che Maschinenfehler es verursacht. Jede Zeile des ausgegebenen Proto-
     kolls enthält entweder einen Maschinenfehler oder den Namen eines Sig-
     nals oder einen Systemaufruf mit seinen Argumenten und Rückkehrwerten.
     Die Argumente von Systemaufrufen werden symbolisch dargestellt, wobei
     nach Möglichkeit die Define-Werte aus den entsprechenden Header-
     Dateien verwendet werden. Fehlerrückkehrwerte werden mit den Fehlerna-
     men ausgegeben, die in introprm2(2) beschrieben sind.

OPTIONEN
     Keine Option angegeben:
          truss gibt auf Standardfehlerausgabe aus, welche Systemaufrufe
          das angegebene Kommando tätigt, welche Signale es empfängt und
          welche Maschinenfehler es verursacht.

     Bei den folgenden Optionen ist es möglich, mehrmals dieselbe Option
     mit verschiedenen Optionsargumenten anzugeben. Für den Fall, daß sich
     dabei Optionsargumente widersprechen, schränken immer die weiter
     rechts stehenden Optionen die weiter links stehenden ein.

     -a   truss gibt bei jedem Aufruf des Systemaufrufs exec(2) die Zei-
          chenketten aus, die als Argumente übergeben werden.

     -c   truss gibt die protokollierten Systemaufrufe, Fehler und Signale
          nicht aus, sondern zählt die Anzahl mit und gibt das Ergebnis
          aus, sobald das angegebene Kommando beendet oder truss unterbro-
          chen wird. Das Ergebnis enthält je eine eigene Summe für System-
          aufrufe, Fehler und Signale.

          Ist zusätzlich die Option -f angegeben, zählt truss die System-
          aufrufe, Fehler und Signale auch für alle Kindprozesse mit.

     -e   truss gibt bei jedem Aufruf des Systemaufrufs exec(2) die Zei-
          chenketten aus, die als Umgebung übergeben werden.

     -f   truss protokolliert auch alle durch fork(2) erzeugten Kindpro-
          zesse und die zugehörigen Signale, Fehler und Systemaufrufe. Jede
          Ausgabezeile enthält zusätzlich eine Prozeßnummer (PID), die
          anzeigt, welcher Prozeß den Systemaufruf aufgerufen oder das Sig-
          nal empfangen hat.







Seite 1                      Reliant UNIX 5.44               Gedruckt 11/98

truss(1)                                                           truss(1)

          -f nicht angegeben:

          Nur das Kommando bzw. der Prozeß, der auf der ersten Stufe
          abläuft, wird protokolliert.

     -i   truss protokolliert Systemaufrufe, die aktuell schlafen und
          unterbrechbar sind, wie z. B. open(2) und read(2) auf Terminalge-
          rätedateien oder Pipes, erst dann, wenn sie abgeschlossen werden.

          -i nicht angegeben:

          truss protokolliert schlafende und unterbrechbare Prozesse ein
          erstes Mal, sobald sie länger als eine Sekunde schlafen, und ein
          zweites Mal, wenn sie abgeschlossen werden.

     -m [!]fehler, ...
          Sie geben einen oder mehrere Maschinenfehler an, die truss proto-
          kollieren soll. Die Maschinenfehler können Sie entweder mit ihrem
          Namen oder mit ihrer Nummer (siehe <sys/fault.h>) angeben. Sollen
          alle Maschinenfehler protokolliert werden, können Sie für fehler
          die Zeichenkette all angeben. Wenn Sie vor fehler ein Ausrufezei-
          chen ! angeben, protokolliert truss die angegebenen Fehler nicht.

          -m [!]fehler nicht angegeben:

          entspricht der Angabe -m all -m !fltpage, d. h. außer FLTPAGE
          (recoverable page fault) werden alle Maschinenfehler ausgegeben.

     -o ausdatei
          truss schreibt seine Ausgabe in die Datei ausdatei.

          -o ausdatei nicht angegeben:

          truss schreibt seine Ausgabe auf die Standardfehlerausgabe.

     -p   truss interpretiert kommando als Liste von Prozeßnummern (PIDs)
          für ablaufende Prozesse [siehe ps(1)] und nicht als Kommando, das
          ausgeführt werden soll. truss kontrolliert jeden angegebenen Pro-
          zeß und protokolliert ihn, vorausgesetzt die Benutzernummer (UID)
          und Gruppennummer (GID) [siehe ps(1)] des aufrufenden Benutzers
          entsprechen der UID und GID des Prozesses oder der aufrufende
          Benutzer ist Systemverwalter. Prozesse können Sie auch über ihre
          im Verzeichnis /proc stehenden Namen angeben, z. B. /proc/1234.
          Dies ist auch für fern eingehängte proc-Verzeichnisse möglich.










Seite 2                      Reliant UNIX 5.44               Gedruckt 11/98

truss(1)                                                           truss(1)

     -r [!]fd, ...
          truss gibt für jeden Systemaufruf read(2) auf einen der für fd
          angegebenen Dateideskriptoren den Inhalt des Ein-/Ausgabepuffers
          vollständig aus. Alle Dateideskriptoren können Sie mit der Zei-
          chenkette all für fd angeben. Wenn Sie vor fd ein Ausrufezeichen
          ! angeben, gibt truss für die angegebenen Dateideskriptoren
          nichts aus. Die Ausgabe enthält 32 Byte je Zeile und stellt jedes
          Byte als ASCII-Zeichen mit einem Leerzeichen davor dar oder Steu-
          erzeichen als C-Escapefolge aus zwei Zeichen wie z. B. \t für
          Tabulatorzeichen und \n für Neue-Zeile-Zeichen. Ist die ASCII-
          Darstellung nicht möglich, wird der Hexadezimal-Code des Byte
          ausgegeben.

          -r [!]fd nicht angegeben:

          entspricht der Angabe -r !all, d. h. für keinen Dateideskriptor
          gibt truss vollständig den Ein-/Ausgabepuffer aus. Für jeden pro-
          tokollierten Systemaufruf read(2) oder write(2) werden nur die
          ersten 12 Bytes ausgegeben.

     -s [!]signal, ...
          Sie geben ein oder mehrere durch Komma getrennte Signale an, die
          truss protokollieren soll. Sollen alle Signale protokolliert wer-
          den, können Sie für signal die Zeichenkette all angeben. Wenn Sie
          vor signal ein Ausrufezeichen ! angeben, protokolliert truss die
          angegebenen Signale nicht. truss protokolliert in seiner Ausgabe
          jedes angegebene empfangene Signal, auch wenn der Prozeß es igno-
          riert (nicht blockiert; blockierte Signale werden erst empfangen,
          wenn der Prozeß sie freigibt). Signale können Sie entweder mit
          ihrem Namen oder mit ihrer Nummer [siehe signal(5)] angeben.

          -s [!]signal nicht angegeben:

          entspricht der Angabe -s all, d. h. alle Signale werden mitproto-
          kolliert.

     -t [!]systemaufruf, ...
          Sie geben einen oder mehrere durch Komma getrennte Systemaufrufe
          an, die truss protokollieren soll. Sollen alle Systemaufrufe pro-
          tokolliert werden, können Sie für systemaufruf die Zeichenkette
          all angeben. Wenn Sie vor systemaufruf ein Ausrufezeichen ! ange-
          ben, protokolliert truss die angegebenen Systemaufrufe nicht.
          Systemaufrufe können Sie entweder über ihre Namen oder Nummern
          angeben [siehe introprm2(2)].

          -t [!]systemaufruf nicht angegeben:

          entspricht der Angabe -t all, d. h. alle Systemaufrufe werden
          mitprotokolliert.





Seite 3                      Reliant UNIX 5.44               Gedruckt 11/98

truss(1)                                                           truss(1)

     -v [!]systemaufruf, ...
          truss gibt den Inhalt jeder Struktur aus, die über ihre Adresse
          an den/die angegebenen Systemaufruf(e) übergeben wird. Übergabe-
          werte und die Werte, die das Betriebssystem zurückgibt, werden
          ausgegeben. Für jedes Feld, das für Ein- und Ausgabe benützt
          wird, wird nur der Ausgabewert ausgegeben. Alle Systemaufrufe
          können Sie mit der Zeichenkette all für systemaufruf angeben.
          Wenn Sie vor systemaufruf ein Ausrufezeichen ! angeben, gibt
          truss für die angegebenen Systemaufrufe den Inhalt der Strukturen
          nicht aus. Systemaufrufe können Sie entweder über ihre Namen oder
          Nummern angeben [siehe introprm2(2)].

          -v [!]systemaufruf nicht angegeben:

          entspricht der Angabe -v !all

     -w [!]fd, ...
          Wie Option -r, nur für den Systemaufruf write(2).

     -x [!]systemaufruf, ...
          truss gibt die Argumente, die an den/die angegebenen Systemauf-
          ruf(e) übergeben werden, nicht symbolisch, sondern in hexadezima-
          ler Form aus. Alle Systemaufrufe können Sie mit der Zeichenkette
          all für systemaufruf angeben. Wenn Sie vor systemaufruf ein Aus-
          rufezeichen ! angeben, gibt truss für die angegebenen Systemauf-
          rufe nichts aus. Systemaufrufe können Sie entweder über ihre
          Namen oder Nummern angeben [siehe introprm2(2)].

          -x [!]systemaufruf nicht angegeben:

          entspricht der Angabe -x !all, d. h. kein Systemaufruf wird in
          hexadezimaler Form ausgegeben.

ARBEITSWEISE
     Wenn Sie truss mit Option -o aufrufen oder die Standardfehlerausgabe
     in eine Datei umlenken, die keine Terminalgerätedatei ist, ignoriert
     truss die Signale SIGHUP, SIGINT und SIGQUIT. Dadurch ist es leichter,
     interaktive Programme zu protokollieren, die solche Signale vom Termi-
     nal erhalten.

     Wenn truss seine Ausgabe auf ein Terminal ausgibt oder wenn mit der
     Option -p bereits existierende Prozesse protokolliert werden, reagiert
     truss auf die Signale SIGHUP, SIGINT und SIGQUIT, indem es alle proto-
     kollierten Prozesse freigibt und sich beendet. Dadurch ist es möglich,
     eine allzu ausführliche Ausgabe von truss abzubrechen und Prozesse
     wieder freizugeben, die vor dem Start von truss bereits existierten.
     Solche Prozesse laufen dann normal weiter als ob nichts gewesen wäre.







Seite 4                      Reliant UNIX 5.44               Gedruckt 11/98

truss(1)                                                           truss(1)

     Mit Ausnahme der Paging-Fehler führen Maschinenfehler dazu, daß der
     den Fehler verursachende Prozeß ein Signal erhält. Der Empfang des
     Signals wird jeweils sofort nach der Meldung des Maschinenfehlers
     (außer Paging-Fehler) gemeldet, es sei denn, der Prozeß blockiert das
     Signal.

     Das Betriebssystem schränkt die Protokollierung von Prozessen aus
     Sicherheitsgründen in einigen Fällen ein: So liefert z. B. ein truss,
     der mit semop auf die Freigabe eines Semaphors wartet, nicht wie
     erwartet "sleeping", sondern Null zurück, da Datenstrukturen ausgehen
     können, falls mehrere Prozesse vom truss verfolgt werden; und so kann
     ein Benutzer, der den Objektcode eines Kommandos (a.out-Datei) nicht
     lesen kann, die Prozesse dieses Kommandos nicht protokollieren. Kom-
     mandos, bei denen für den Eigentümer oder für die Gruppe das s-Bit
     [siehe chmod(1)] gesetzt ist, kann nur der Systemverwalter protokol-
     lieren. truss verliert die Kontrolle über jeden Prozeß, der einen
     exec(2)-Systemaufruf für eine Objektdatei durchführt, für die das s-
     Bit gesetzt ist oder die nicht lesbar ist, es sei denn, truss wird vom
     Systemverwalter aufgerufen. Solche Prozesse werden ab dem Aufruf von
     exec(2) unbeeinflußt von truss normal fortgesetzt.

     Um Konflikte mit anderen kontrollierenden Prozessen zu vermeiden, pro-
     tokolliert truss keinen Prozeß, der bereits von einem anderen Prozeß
     über die Schnittstelle /proc kontrolliert wird. Im Verzeichnis /proc
     wird für jeden laufenden Prozeß eine Datei angelegt, auf die Aufrufe
     wie open(2), close(2) und ioctl(2) zugreifen können. Diesen Mechanis-
     mus verwenden zum Beispiel Debugger wie sdb alternativ zu ptrace(2).
     Auch truss verwendet diesen Mechanismus. Wenn ein Prozeß bereits von
     einem anderen Prozeß durch /proc kontrolliert wird, kann dieser Prozeß
     von truss nicht mehr bearbeitet werden, wie folgendes Beispiel zeigt:

     $ truss -o /dev/null sh&

     Angenommen, der Prozeß sh hat die Prozeßnummer 18027:

     $ truss -p 18027

     truss: someone else is tracing process 18027

     Jedoch ist es möglich, truss auf einen Debugger anzuwenden, der sei-
     nerseits einen Prozeß per /proc kontrolliert. Dabei kann truss dann
     zwar den Debugger protokollieren, nicht aber den von dem Debugger
     gestarteten Prozeß. Ebenso kann truss auf sich selbst angewendet wer-
     den, z. B.:










Seite 5                      Reliant UNIX 5.44               Gedruckt 11/98

truss(1)                                                           truss(1)

     $ truss truss ls
               |    |
               |    kann vom ersten truss nicht mitprotokolliert werden,
               |    da bereits vom zweiten truss per proc(4) kontrolliert
               |
               kann protokolliert werden.

     Die Ausgabe von truss enthält Tabulatorzeichen, wobei von Standard-
     Tabulatorstopps in jeder 8. Spalte ausgegangen wird.

     Die Ausgabe für mehrere Prozesse erfolgt in keiner festgelegten zeit-
     lichen Reihenfolge. Zum Beispiels kann es sein, daß der Systemaufruf
     read(2) auf eine Pipe vor dem entsprechenden Systemaufruf write(2)
     protokolliert wird. Für einen einzigen Prozeß erfolgt die Ausgabe
     exakt in der richtigen zeitlichen Reihenfolge.

     Beim Protokollieren von Kindprozessen kann es passieren, daß das
     System an die Grenze der pro Benutzer gleichzeitig möglichen Prozesse
     stößt (das System legt eine Grenze von 25 möglichen Prozessen fest).
     Denn wird mehr als ein Prozeß protokolliert, läuft truss für jeden
     Prozeß, der protokolliert werden soll, als eigener kontrollierender
     Prozeß. Das Kommando spell benötigt zum Beispiel 9 Prozesse, und truss
     fügt weitere 9 hinzu, so daß insgesamt 18 Prozesse laufen.

     truss benutzt bei der Protokollierung von mehr als einem Prozeß die
     Mechanismen shared memory und Semaphoren (Optionen -f und -p bei mehr
     als einer PID). Wenn diese Mechanismen auf einem System nicht zur Ver-
     fügung stehen, aber gebraucht werden, gibt truss eine Warnung aus und
     arbeitet weiter. In diesem Fall kann aber die Ausgabe von truss durch-
     einandergeraten und die Ausgabe bei Option -c protokolliert nur das
     Kommando der höchsten Ebene oder die erste PID und keine Kindprozesse.

FEHLERMELDUNGEN
     truss: someone else is tracing process <PID>
          truss wurde auf einen bereits anderweitig kontrollierten Prozeß
          angewandt.

     truss: invalid process id: <PID>
          Nicht vorhandene Prozeßnummer PID.

     truss: cannot control process <PID>
          Zugriffsberechtigung für Prozeßnummer PID fehlt.

     truss: Cannot find program: name
          truss findet das angegebene Programm name nicht.









Seite 6                      Reliant UNIX 5.44               Gedruckt 11/98

truss(1)                                                           truss(1)

BEISPIELE
     Beispiel 1

     Protokollieren des Kommandos find und Ausgabe des Protokolls auf dem
     Bildschirm (Standardfehlerausgabe), wobei die Ausgabe von find (Stan-
     dardausgabe) in die Datei find.aus umgelenkt wird:

     $ truss find . -print > find.aus

     Beispiel 2

     Protokollieren der Systemaufrufe open(2), close(2), read(2) und
     write(2), die das Kommando find aufruft:

     $ truss -t open,close,read,write find . -print > find.aus

     Beispiel 3

     Protokollieren des Kommandos spell, dem die Datei document als Argu-
     ment übergeben wird. Die Ausgabe von truss wird mit der Option -o in
     die Datei truss.aus umgelenkt. Da spell ein Shell-Skript ist, muß
     truss mit der Option -f aufgerufen werden, damit auch die Kindprozesse
     protokolliert werden.

     $ truss -f -o truss.aus spell document

     Beispiel 4

     Protokollieren der Aktivitäten des init-Prozesses. Dazu ist nur der
     Systemverwalter berechtigt.

     $ truss -p -v all 1

DATEIEN
     /proc    Verzeichnis, mit den für jeden laufenden Prozeß angelegten
              Dateien.

SIEHE AUCH
     ps(1), introprm2(2), signal(5).















Seite 7                      Reliant UNIX 5.44               Gedruckt 11/98

Typewritten Software • bear@typewritten.org • Edmonds, WA 98026