Handbuch zur dynamischen Ablaufverfolgung in Solaris

Subroutinen

Subroutinen unterscheiden sich dadurch von Aktionen, dass sie im Allgemeinen nur den internen DTrace-Status beeinflussen. Es gibt also keine destruktiven Subroutinen, und Subroutinen schreiben niemals Datenablaufprotokolle in Puffer. Viele der Subroutinen besitzen ein Pendant unter den Schnittstellen aus Teil 9F und 3C. Weitere Informationen zu den entsprechenden Subroutinen finden Sie unter Intro(9F) und Intro(3).

alloca()

void *alloca(size_t Groesse)

alloca() reserviert im Scratch-Bereich die Menge der mit Groesse angegebenen Byte und gibt einen Zeiger auf den reservierten Speicherplatz zurück. Der zurückgegebene Zeiger hat immer eine 8-Byte-Ausrichtung. Die Gültigkeit des Scratch-Bereichs beschränkt sich auf die Lebensdauer einer Klausel. Nach Abschluss der Klausel wird die Zuweisung des mit alloca() reservierten Speicherplatzes wieder aufgehoben. Wenn nicht genügend Platz im Scratch-Bereich vorhanden ist, wird kein Speicherplatz reserviert und ein Fehler generiert.

basename()

string basename(char *Zeichenkette)

basename() ist ein D-Pendant zu basename(1). Diese Subroutine erzeugt eine Zeichenkette, die aus einer Kopie der angegebenen Zeichenkette ohne ein auf / endendes Präfix besteht. Der zurückgegebenen Zeichenkette wird Speicherplatz im Scratch-Bereich reserviert, sodass sie nur für die Dauer der Klausel gültig ist. Wenn nicht genügend Platz im Scratch-Bereich vorhanden ist, wird basename nicht ausgeführt und ein Fehler generiert.

bcopy()

void bcopy(void *src, void *dest, size_t Groesse)

bcopy() kopiert so viele Byte wie mit Groesse angegeben aus dem Speicherbereich, auf den Ausg zeigt, in den mit Ziel angegebenen Speicherbereich. Der Ausgangsspeicher muss vollständig außerhalb des Scratch-Bereichs und der Zielspeicher vollständig darin liegen. Werden diese Voraussetzungen nicht erfüllt, erfolgt keine Kopie und es wird ein Fehler generiert.

cleanpath()

string cleanpath(char *Zeichenkette)

cleanpath() erzeugt eine Zeichenkette, die aus einer um gewisse redundante Teile gekürzten Kopie des mit Zeichenkette angegebenen Pfads besteht. Insbesondere werden „/.„/./”-Elemente aus dem Pfad entfernt und „/../”-Elemente gekürzt. Bei der Kürzung der /../-Elemente im Pfad werden symbolische Links nicht berücksichtigt. Deshalb ist es denkbar, dass cleanpath() einen gültigen Pfad übernimmt und einen kürzeren, ungültigen zurückgibt.

Wenn die Zeichenkette beispielsweise „ /foo/../bar” ist und /foo ein symbolischer Link zu /net/foo/export, dann gibt cleanpath() die Zeichenkette „/bar” zurück, obwohl sich bar möglicherweise nur in /net/foo und nicht in / befindet. Diese Einschränkung ist darauf zurückzuführen, dass cleanpath() im Kontext eines ausgelösten Prüfpunkts aufgerufen wird, wo eine vollständige Auflösung symbolischer Links oder beliebiger Namen nicht möglich ist. Der zurückgegebenen Zeichenkette wird Speicherplatz im Scratch-Bereich reserviert, sodass sie nur für die Dauer der Klausel gültig ist. Wenn nicht genügend Platz im Scratch-Bereich vorhanden ist, wird cleanpath nicht ausgeführt und ein Fehler generiert.

copyin()

void *copyin(uintptr_t Adr, size_t Groesse)

copyin() kopiert die angegebene Größe in Byte von der angegebenen Benutzeradresse in einen Scratch-Puffer von DTrace und gibt die Adresse dieses Puffers zurück. Die Benutzeradresse wird als eine Adresse im Bereich des Prozesses interpretiert, zu dem der aktuelle Thread gehört. Der zurückgegebene Zeiger auf den Puffer hat immer eine 8-Byte-Ausrichtung. Die betreffende Adresse muss auf eine durch Seitenfehler eingelagerte Seite im aktuellen Prozess zutreffen. Ist dies nicht der Fall oder ist nur unzureichender Scratch-Platz verfügbar, wird NULL zurückgegeben und ein Fehler generiert. Informationen zu Verfahren, mit denen das Auftreten von copyin-Fehlern vermindert wird, finden Sie in Kapitel 33Ablaufverfolgung von Benutzerprozessen.

copyinstr()

string copyinstr(uintptr_t Adr)

copyinstr() kopiert eine auf Null endende C-Zeichenkette von der angegebenen Benutzeradresse in einen Scratch-Puffer von DTrace und gibt die Adresse dieses Puffers zurück. Die Benutzeradresse wird als eine Adresse im Bereich des Prozesses interpretiert, zu dem der aktuelle Thread gehört. Die Länge der Zeichenkette ist auf den mit der Option strsize festgelegten Wert beschränkt. Näheres hierzu siehe Kapitel 16Optionen und Tunables . Wie auch bei copyin muss die angegebene Adresse mit einer durch Seitenfehler eingelagerten Seite im aktuellen Prozess übereinstimmen. Ist dies nicht der Fall oder ist nur unzureichender Scratch-Platz verfügbar, wird NULL zurückgegeben und ein Fehler generiert. Informationen zu Verfahren, mit denen das Auftreten von Kapitel 33Ablaufverfolgung von Benutzerprozessen-Fehlern vermindert wird, finden Sie in Chapter 33, User Process Tracing.

copyinto()

void copyinto(uintptr_t Adr, size_t Groesse, void *Ziel)

copyinto() kopiert die angegebene Menge Byte von der angegebenen Benutzeradresse in den mit Ziel festgelegten Scratch-Puffer von DTrace. Die Benutzeradresse wird als eine Adresse im Bereich des Prozesses interpretiert, zu dem der aktuelle Thread gehört. Die betreffende Adresse muss auf eine durch Seitenfehler eingelagerte Seite im aktuellen Prozess zutreffen. Ist dies nicht der Fall oder liegt auch nur ein Teil des Zielspeichers außerhalb des Scratch-Bereichs, erfolgt keine Kopie und ein Fehler wird generiert. Informationen zu Verfahren, mit denen das Auftreten von Kapitel 33Ablaufverfolgung von Benutzerprozessen-Fehlern vermindert wird, finden Sie in Chapter 33, User Process Tracing.

dirname()

string dirname(char *Zeichenkette)

dirname() ist ein D-Pendant zu dirname(1). Diese Subroutine erzeugt eine Zeichenkette, die aus dem mit Zeichenkette angegebenen Pfadnamen ohne dem letzten Glied besteht. Der zurückgegebenen Zeichenkette wird Speicherplatz im Scratch-Bereich reserviert, sodass sie nur für die Dauer der Klausel gültig ist. Wenn nicht genügend Platz im Scratch-Bereich vorhanden ist, wird dirname nicht ausgeführt und ein Fehler generiert.

msgdsize()

size_t msgdsize(mblk_t *Meldungszeiger)

msgdsize() gibt die Anzahl der Byte in der Datenmeldung zurück, auf die Meldungszeiger zeigt. Ausführliche Informationen finden Sie im Abschnitt msgdsize(9F). msgdsize() berücksichtigt in der Zählung nur Datenblöcke des Typs M_DATA.

msgsize()

size_t msgsize(mblk_t *Meldungszeiger)

msgsize() gibt die Anzahl der Byte in der Meldung zurück, auf die Meldungszeiger zeigt. Anders als msgdsize() gibt msgsize() nicht nur die Anzahl der Datenbyte, sondern die Gesamtbyteanzahl der Meldung zurück.

mutex_owned()

int mutex_owned(kmutex_t *Mutex)

mutex_owned() ist eine Implementierung von mutex_owned(9F). mutex_owned() gibt einen Wert ungleich Null zurück, wenn der aufrufende Thread derzeit den angegebenen Kernel-Mutex belegt, und Null, wenn der angegebene adaptive Mutex derzeit frei ist.

mutex_owner()

kthread_t *mutex_owner(kmutex_t *Mutex)

mutex_owner() gibt den Thread-Zeiger des aktuellen Besitzers des angegebenen adaptiven Kernel-Mutex zurück. mutex_owner() gibt NULL zurück, wenn der angegebene adaptive Mutex derzeit frei ist oder es sich bei dem angegebenen Mutex um eine Warteschleife (Spinlock) handelt. Siehe hierzu mutex_owned(9F).

mutex_type_adaptive()

int mutex_type_adaptive(kmutex_t *Mutex)

mutex_type_adaptive() gibt einen Wert ungleich Null zurück, wenn es sich bei dem angegebenen Kernel-Mutex um den Typ MUTEX_ADAPTIVE handelt, anderenfalls gibt die Aktion Null zurück. Ein Mutex ist dann adaptiv, wenn er mindestens eine der folgenden Bedingungen erfüllt:

mutex_init(9F) enthält weitere Informationen zu Mutexen. Die meisten Mutexe im Solaris-Kernel sind adaptiv.

progenyof()

int progenyof(pid_t PID)

progenyof() gibt einen Wert ungleich Null zurück, wenn der aufrufende Prozess (der Prozess, zu dem der Thread gehört, der derzeit den übereinstimmenden Prüfpunkt auslöst) ein Nachkomme des mit der ID angegebenen Prozesses ist.

rand()

int rand(void)

rand() gibt eine pseudo-zufällige Ganzzahl zurück. Die zurückgegebene Zahl ist eine schwache, pseudo-zufällige Zahl, die in keiner kryptographischen Anwendung verwendet werden sollte.

rw_iswriter()

int rw_iswriter(krwlock_t *rwlock)

rw_iswriter() gibt einen Wert ungleich Null zurück, wenn die angegebene Leser/Schreiber-Sperre entweder von einem Schreiber belegt oder angefordert wird. Wird die Sperre nur von Lesern belegt und ist kein Schreiber blockiert oder ist die Sperre ganz frei, gibt rw_iswriter() Null zurück. Siehe hierzu rw_init(9F).

rw_write_held()

int rw_write_held(krwlock_t *rwlock)

rw_write_held() gibt einen Wert ungleich Null zurück, wenn die angegebene Leser/Schreiber-Sperre derzeit im Besitz eines Schreibers ist. Ist die Sperre entweder nur von Lesern belegt oder ganz frei, gibt rw_write_held() Null zurück. Siehe hierzu rw_init(9F).

speculation()

int speculation(void)

speculation() reserviert einen spekulativen Tracing-Puffer für die Verwendung durch speculate() und gibt eine ID für diesen Puffer zurück. Ausführliche Informationen finden Sie in Kapitel 13Spekulative Ablaufverfolgung.

strjoin()

string strjoin(char *Zeichenkette1, char *Zeichenkette2)

strjoin() erzeugt eine Zeichenkette, die aus einer Verkettung von Zeichenkette1 und Zeichenkette2 besteht. Der zurückgegebenen Zeichenkette wird Speicherplatz im Scratch-Bereich reserviert, sodass sie nur für die Dauer der Klausel gültig ist. Wenn nicht genügend Platz im Scratch-Bereich vorhanden ist, wird strjoin nicht ausgeführt und ein Fehler generiert.

strlen()

size_t strlen(string Zeichenkette)

strlen() gibt die Länge der angegebenen Zeichenkette in Byte ohne das abschließende Null-Byte zurück.