In den vorangehenden Beispielen haben Sie die Verwendung zwei einfacher Prüfpunkte namens BEGIN und END erlernt. Woher kamen diese Prüfpunkte eigentlich? Prüfpunkte in DTrace stammen aus einer Gruppe von Kernelmodulen, den Providern. Jeder Provider nimmt eine bestimmte Art der Instrumentation zur Erstellung von Prüfpunkten vor. Bei der Verwendung von DTrace erhält jeder Provider die Gelegenheit, die Prüfpunkte zu veröffentlichen, die er dem DTrace-Framework zur Verfügung stellt. Sie können dann Ablaufverfolgungsaktionen aktivieren und einem beliebigen der veröffentlichten Prüfpunkte zuordnen. Zum Auflisten aller auf dem System verfügbaren Prüfpunkte geben Sie folgenden Befehl ein:
# dtrace -l ID PROVIDER MODULE FUNCTION NAME 1 dtrace BEGIN 2 dtrace END 3 dtrace ERROR 4 lockstat genunix mutex_enter adaptive-acquire 5 lockstat genunix mutex_enter adaptive-block 6 lockstat genunix mutex_enter adaptive-spin 7 lockstat genunix mutex_exit adaptive-release ... many lines of output omitted ... # |
Die Anzeige der gesamten Ausgabe kann eine Weile dauern. Für die Anzeige der Gesamtanzahl aller Prüfpunkte geben Sie folgenden Befehl ein:
# dtrace -l | wc -l 30122 |
Die Anzahl auf Ihrem System kann hiervon abweichen, da sie von der jeweiligen Betriebsplattform und der installierten Software abhängt. Die enorme Menge an verfügbaren Prüfpunkten gewährt Ihnen einen Einblick in jeden bislang dunklen Winkel des Systems. Selbst diese Ausgabe ist noch keine vollständige Liste aller Prüfpunkte, da einige Provider, wie Sie später erfahren werden, die Möglichkeit bieten, auf Grundlage Ihrer Tracing-Anforderungen neue Prüfpunkte on-the-fly zu erstellen und die tatsächliche Anzahl der DTrace-Prüfpunkte somit schier ins Unendliche treiben.
Schauen Sie sich noch einmal die Ausgabe von dtrace -l im Terminalfenster an. Beachten Sie, dass jeder Prüfpunkt mit den zwei zuvor genannten Namen, der ganzzahligen ID und dem textuellen Namen, aufgeführt ist. Der textuelle Name besteht aus vier Teilen, die in der dtrace-Ausgabe als vier separate Spalten angezeigt werden. Es werden die folgenden Bestandteile eines Prüfpunktnamens unterschieden:
Provider |
Der Name des DTrace-Providers, der diesen Prüfpunkt veröffentlicht. Der Name des Providers stimmt bezeichnenderweise mit dem Namen des DTrace-Kernelmoduls überein, das die Instrumentation zur Aktivierung des Prüfpunkts durchführt. |
Modul |
Bei Prüfpunkten für eine bestimmte Programmposition der Name des Moduls, in dem sich der Prüfpunkt befindet. Dabei handelt es sich entweder um den Namen eines Kernelmoduls oder einer Benutzerbibliothek. |
Funktion |
Bei Prüfpunkten für eine bestimmte Programmposition der Name der Programmfunktion, in der sich der Prüfpunkt befindet. |
Name |
Der letzte Bestandteil des Prüfpunktnamens gibt, wie beispielsweise BEGIN oder END, in gewissem Maße Aufschluss über die semantische Bedeutung des Prüfpunkts. |
Geben Sie beim Ausschreiben des vollständigen textuellen Namens eines Prüfpunkts alle vier, durch Doppelpunkt getrennte Bestandteile an:
Provider:Modul: Funktion:Name
Für einige Prüfpunkte, wie beispielsweise BEGIN und END, sind in der Liste weder Modul noch Funktion aufgeführt. Bei einigen Prüfpunkten bleiben diese Felder leer, da sie keiner bestimmten instrumentierten Programmfunktion oder -position entsprechen. Sie beziehen sich vielmehr auf ein abstraktes Konzept wie zum Beispiel das Ende einer Tracing-Anforderung. Prüfpunkte, deren Namen Modul- und Funktionsbestandteile enthalten, werden als verankerte Prüfpunkte bezeichnet, solche ohne diese Bestandteile als nicht verankerte Prüfpunkte.
Wenn Sie nicht alle Felder eines Prüfpunktnamens angeben, wird Ihre Anforderung von DTrace konventionsgemäß auf alle Prüfpunkte mit übereinstimmenden Werten in den von Ihnen angegebenen Namensbestandteilen angewendet. Das heißt also, dass Sie DTrace zuvor mit der Angabe des Prüfpunktnamens BEGIN angewiesen haben, unabhängig von den Werten im Provider-, Modul- und Funktionsfeld alle Prüfpunkte mit dem Namensfeld BEGIN zu suchen. Zufällig gibt es nur einen Prüfpunkt mit dieser Beschreibung, und deshalb fällt das Ergebnis gleich aus. Doch Sie wissen nun, dass dtrace:::BEGIN der richtige Name des Prüfpunkts BEGIN ist und darauf hinweist, dass dieser Prüfpunkt vom DTrace-Framework selbst bereitgestellt wird (DTrace ist sein Provider) und an keiner Funktion verankert ist. Wir könnten das Programm hello.d also auch wie folgt schreiben und dasselbe Ergebnis erhalten:
dtrace:::BEGIN { trace("hello, world"); exit(0); }
Nachdem Sie jetzt wissen, woher Prüfpunkte kommen und wie sie benannt werden, betrachten wir ein wenig genauer, was geschieht, wenn Sie Prüfpunkte aktivieren und DTrace zu einem Vorgang anweisen. Anschließend kehren wir zu unserem Blitzkurs in D zurück.