ptrace(2) ptrace(2)
NAME
ptrace - Prozeßablauf verfolgen
SYNTAX
#include <unistd.h>
#include <sys/types.h>
long ptrace(int request, pidt pid, long addr, long data);
BESCHREIBUNG
Mit ptrace() kann ein Vaterprozeß die Ausführung eines Sohnprozesses
steuern. Das Kommando wird hauptsächlich zur Fehlersuche mit Hilfe von
Haltepunkten verwendet. Normalerweise läuft der Sohnprozeß wunschgemäß
ab, bis ein Signal eintritt [siehe Liste in signal(5)], bei dem er
einen Stopp-Zustand erreicht, woraufhin der Vaterprozeß über wait(2)
entsprechend benachrichtigt wird. Befindet sich der Sohnprozeß im
Stopp-Zustand, kann der Vaterprozeß den "Speicherabzug" mit ptrace()
prüfen und ändern. Auch kann der Vaterprozeß veranlassen, daß der
Sohnprozeß die Ausführung entweder beendet oder weiter ausführt, wobei
die Möglichkeit gegeben ist, das Signal, welches das Stoppen verur-
sacht, zu ignorieren.
Mit dem Argument request wird die ptrace()-Aktion festgelegt. request
kann folgende Werte haben:
0 Der Sohnprozeß fordert, daß sein Ablauf vom Vaterprozeß verfolgt
werden soll. Die Ablaufverfolgungsoption des Sohnprozesses wird
eingeschaltet, welche bestimmt, daß der Sohnprozeß bei Empfang
des Signals in einem Stopp-Zustand und nicht in dem mit disp
angegebenen Zustand gelassen wird [siehe signal(2)]. Die Argu-
mente pid, addr, und data werden ignoriert, und ein Rückgabewert
für diese Anforderung ist nicht definiert. Wenn der Vaterprozeß
keine Ablaufverfolgung des Sohnprozesses durchführt, entstehen
eigenartige Resultate.
Alle weiteren Anforderungen können nur vom Vaterprozeß eingesetzt wer-
den. Für beide ist pid die Prozeßnummer des Sohnprozesses. Der Sohn-
prozeß muß sich in einem Stopp- Zustand befinden, bevor diese Anforde-
rungen gestellt werden können.
1, 2 Das Wort an der Stelle addr im Adreßraum des Sohnprozesses wird
an den Vaterprozeß zurückgegeben. Sind Anweisungs- und Datenbe-
reich voneinander getrennt, gibt Anforderung 1 ein Wort aus dem
Anweisungsbereich und Anforderung 2 aus dem Datenbereich zurück.
Sind die Anweisungs- und Datenbereiche nicht voneinander
getrennt, führen die Anforderungen 1 und 2 zum gleichen Ergebnis.
Das Argument data wird ignoriert. Diese beiden Anforderungen
bleiben erfolglos, wenn addr nicht die Anfangsadresse eines Worts
ist. In diesem Fall wird ein Wert von -1 an den Vaterprozeß
zurückgegeben, und errno des Vaterprozesses wird auf EIO gesetzt.
Seite 1 Reliant UNIX 5.44 Gedruckt 11/98
ptrace(2) ptrace(2)
3 Das Wort an der Stelle addr im Benutzerbereich des Sohnes im
System-Prozeßverwaltungsbereich (siehe sys/user.h) wird an den
Vaterprozeß zurückgegeben. Das Argument data wird ignoriert.
Diese Anforderung ist erfolglos, wenn addr nicht die Anfangs-
adresse eines Worts ist oder außerhalb des Benutzerbereichs
liegt. In diesem Fall wird ein Wert von -1 an den Vaterprozeß
zurückgegeben, und errno des Vaterprozesses wird auf EIO gesetzt.
4, 5 Der für das Argument data gegebene Wert wird in den Adreßraum des
Sohnprozesses an die Stelle addr geschrieben. Wenn Anweisungs-
und Datenbereich voneinander getrennt sind, schreibt die Anforde-
rung 4 ein Wort in den Anweisungsbereich und die Anforderung 5
ein Wort in den Datenbereich. Sind die Anweisungs- und Datenbe-
reiche nicht voneinander getrennt, führen die Anforderungen 4 und
5 zu dem gleichen Ergebnis. Nach erfolgreicher Beendigung wird
der in den Adreßraum des Sohnprozesses geschriebene Wert an den
Vaterprozeß zurückgegeben. Diese beiden Anforderungen sind erfol-
glos, wenn addr nicht die Anfangsadresse eines Worts war. In die-
sem Fall wird ein Wert von -1 an den Vaterprozeß zurückgegeben,
und errno des Vaterprozesses wird auf EIO gesetzt.
6 Mit dieser Anforderung können einige Einträge in den Benutzerbe-
reich des Sohnprozesses geschrieben werden. data liefert den
Wert, der geschrieben werden soll, und addr ist die Stelle für
den Eintrag. Die Einträge können Register und Bedingungscodes vom
Statuswort des Prozessors sein.
7 Der Sohnprozeß nimmt die Ausführung wieder auf. Wenn das Argument
data 0 ist, werden alle anstehenden Signale einschließlich des
Signals, das den Stopp des Sohnprozesses verursacht hat, vor der
Wiederaufnahme der Ausführung aufgehoben. Wenn das Argument data
eine gültige Signalnummer ist, nimmt der Sohnprozeß die Ausfüh-
rung wieder auf, als ob er dieses Signal angetroffen hätte, und
alle anderen anstehenden Signale werden aufgehoben. Das Argument
addr muß für diese Anforderung gleich 1 sein. Nach erfolgreicher
Beendigung wird der Wert von data wieder an den Vaterprozeß
zurückgegeben. Diese Anforderung ist erfolglos, wenn data nicht 0
oder keine gültige Signalnummer ist. In diesem Fall wird ein Wert
von -1 an den Vaterprozeß zurückgegeben, und errno des Vaterpro-
zesses wird auf EIO gesetzt.
8 Der Sohnprozeß wird mit den gleichen Folgen beendet wie exit(2).
9 Das Ablauf-Verfolgungsbit im Prozessor-Statuswort des Sohnprozes-
ses wird gesetzt und führt dann dieselben Schritte aus wie oben
für Anforderung 7 aufgelistet. Das Ablauf-Verfolgungsbit bewirkt
eine Unterbrechung nach Ausführung einer Maschinenanweisung. Dies
ermöglicht Einzelschritt-Ablaufverfolgungen des Sohnes.
Seite 2 Reliant UNIX 5.44 Gedruckt 11/98
ptrace(2) ptrace(2)
Zur Verhinderung unbefugter Eingriffe sperrt ptrace() das Setzen des
s-Bits bei den nachfolgenden exec(2)-Aufrufen. Wenn ein ablaufverfolg-
ter Prozeß exec(2) aufruft, stoppt der Prozeß vor Ausführung der
ersten Anweisung des neuen Programms mit der Anzeige von Signal
SIGTRAP. ptrace() ist im allgemeinen erfolglos, wenn einer oder meh-
rere der nachstehenden Punkte zutreffen:
EIO request ist eine unzulässige Nummer.
ESRCH pid kennzeichnet einen Sohnprozeß, der nicht vorhanden oder
kein ptrace() mit der Anforderung 0 ist.
EPERM Das aufrufende Programm hat nicht die notwendigen MAC-Privi-
legien.
SIEHE AUCH
exec(2), signal(2), wait(2), unistd(4), types(5).
Seite 3 Reliant UNIX 5.44 Gedruckt 11/98