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