Der Provider dtrace stellt verschiedene Prüfpunkte zur Verfügung, die sich auf DTrace selbst beziehen. Diese Prüfpunkte dienen zum Initialisieren des Status vor Beginn der Ablaufverfolgung, Verarbeiten des Status nach Abschluss der Ablaufverfolgung und Behandeln unerwarteter Ausführungsfehler in anderen Prüfpunkten.
Der Prüfpunkt BEGIN wird vor jedem anderen Prüfpunkt ausgelöst. Bevor nicht alle BEGIN-Klauseln abgeschlossen sind, wird kein anderer Prüfpunkt ausgelöst. Mit diesem Prüfpunkt lässt sich jeder in anderen Prüfpunkten benötigte Status initialisieren. Das folgende Beispiel zeigt, wie mithilfe des Prüfpunkts BEGIN ein assoziativer Vektor initialisiert werden kann, der mmap(2)-Schutzbits Textrepräsentationen zuweist:
BEGIN { prot[0] = "---"; prot[1] = "r--"; prot[2] = "-w-"; prot[3] = "rw-"; prot[4] = "--x"; prot[5] = "r-x"; prot[6] = "-wx"; prot[7] = "rwx"; } syscall::mmap:entry { printf("mmap with prot = %s", prot[arg2 & 0x7]); }
Der Prüfpunkt BEGIN wird in einem nicht spezifizierten Kontext ausgelöst. Das bedeutet, dass die Ausgabe von stack() oder ustack() sowie der Wert kontextspezifischer Variablen (z. B. execname) beliebig sind. Diese Werte sind nicht zuverlässig und von ihrer Interpretation sollten keine wichtigen Informationen abgeleitet werden. Für den Prüfpunkt BEGIN sind keine Argumente definiert.
Der Prüfpunkt END wird nach allen anderen Prüfpunkten ausgelöst. Bevor nicht alle anderen Prüfpunktklauseln abgeschlossen sind, wird dieser Prüfpunkt nicht ausgelöst. Dieser Prüfpunkt kann zum Verarbeiten von abgerufenen Statusinformationen oder zum Formatieren der Ausgabe verwendet werden. Deshalb finden wir im Prüfpunkt END häufig die Aktion printa. () Mit der Kombination aus den Prüfpunkten BEGIN und END lässt sich messen, wie viel Zeit insgesamt auf eine Ablaufverfolgung aufgewendet wird:
BEGIN { start = timestamp; } /* * ... other tracing actions... */ END { printf("total time: %d secs", (timestamp - start) / 1000000000); }
Unter Datennormalisierung und printa() sind weitere übliche Verwendungszwecke des Prüfpunkts END beschrieben.
Ebenso wie für den Prüfpunkt BEGIN sind auch für END keine Argumente definiert. Der Kontext, in dem der Prüfpunkt END ausgelöst wird, ist beliebig und sollte nicht als verlässlich betrachtet werden.
Bei einer Ablaufverfolgung, für die die Option bufpolicy auf fill gesetzt ist, wird genügend Speicherplatz für etwaige Aufzeichnungen aus dem Prüfpunkt END reserviert. Ausführliche·Informationen finden Sie unter Die Richtlinie fill und END-Prüfpunkte.
Die Aktion exit() bewirkt, dass die Ablaufverfolgung beendet wird und löst den Prüfpunkt END aus. Es kommt jedoch zu einer gewissen Verzögerung zwischen dem Aufruf der Aktion exit() und der Auslösung des Prüfpunkts END. Während dieser Verzögerung wird kein Prüfpunkt ausgelöst. Nachdem ein Prüfpunkt die Aktion exit() aufgerufen hat, wird der Prüfpunkt END erst dann ausgelöst, wenn der DTrace-Verbraucher feststellt, dass exit() aufgerufen wurde und die Ablaufverfolgung beendet. Mit der Option statusrate lässt sich festlegen, mit welcher Frequenz der Beendigungsstatus überprüft wird. Weitere Informationen finden Sie in Kapitel 16Optionen und Tunables .
Der Prüfpunkt ERROR wird ausgelöst, wenn bei der Ausführung einer Klausel für einen DTrace-Prüfpunkt ein Laufzeitfehler auftritt. Wenn beispielsweise mit einer Klausel versucht wird, einen NULL-Zeiger zu dereferenzieren, wird der Prüfpunkt ERROR, wie das nächste Beispiel veranschaulicht, ausgelöst.
BEGIN { *(char *)NULL; } ERROR { printf("Hit an error!"); }
Wenn Sie dieses Programm ausführen, erhalten Sie eine Ausgabe wie die folgende:
# dtrace -s ./error.d dtrace: script './error.d' matched 2 probes CPU ID FUNCTION:NAME 2 3 :ERROR Hit an error! dtrace: error on enabled probe ID 1 (ID 1: dtrace:::BEGIN): invalid address (0x0) in action #1 at DIF offset 12 dtrace: 1 error on CPU 2 |
Die Ausgabe zeigt, dass der Prüfpunkt ERROR ausgelöst wurde und veranschaulicht, wie dtrace(1M) den Fehler meldet. dtrace besitzt eine eigene Aktivierung des Prüfpunkts ERROR, die es ihm ermöglicht, Fehler zu melden. In Verbindung mit dem Prüfpunkt ERROR können Sie eine benutzerdefinierte Fehlerbehandlung einrichten.
Die Argumente für den Prüfpunkt ERROR lauten:
arg1 |
Die EPID (ID des aktivierten Prüfpunkts) des Prüfpunkts, der den Fehler verursacht hat |
arg2 |
Der Index der Aktion, die den Fehler verursacht hat |
arg3 |
Der DIF-Versatz innerhalb dieser Aktion oder -1, wenn nicht zutreffend |
arg4 |
Der Fehlertyp |
arg5 |
Für den Fehlertyp spezifischer Wert |
Die nachfolgende Tabelle beschreibt die verschiedenen Fehlertypen und den Wert, den arg5 je Typ annimmt:
Wert arg4 |
Beschreibung |
Bedeutung arg5 |
---|---|---|
DTRACEFLT_UNKNOWN |
Unbekannter Fehlertyp |
Keinen |
DTRACEFLT_BADADDR |
Zugriff auf nicht zugeordnete oder ungültige Adresse |
Adresse, auf die zugegriffen wurde |
DTRACEFLT_BADALIGN |
Zugriff auf nicht ausgerichteten Speicher |
Adresse, auf die zugegriffen wurde |
DTRACEFLT_ILLOP |
Unzulässiger oder ungültiger Vorgang |
Keinen |
DTRACEFLT_DIVZERO |
Division einer Ganzzahl durch Null |
Keinen |
DTRACEFLT_NOSCRATCH |
Nicht genügend Scratch-Platz für Scratch-Speicherzuweisung |
Keinen |
DTRACEFLT_KPRIV |
Versuchter Zugriff auf eine Kerneladresse oder -Eigenschaft ohne ausreichende Rechte |
Adresse, auf die zugegriffen wurde, oder 0, wenn nicht zutreffend |
DTRACEFLT_UPRIV |
Versuchter Zugriff auf eine Benutzeradresse oder -Eigenschaft ohne ausreichende Rechte |
Adresse, auf die zugegriffen wurde, oder 0, wenn nicht zutreffend |
DTRACEFLT_TUPOFLOW |
DTrace-interner Parameter-Stacküberlauf |
Keinen |
Wenn die im Prüfpunkt ERROR selbst durchgeführten Aktionen einen Fehler verursachen, wird dieser Fehler kommentarlos verworfen - der Prüfpunkt ERROR wird nicht rekursiv aufgerufen.
Der Provider dtrace beschreibt die verschiedenen Stabilitäten anhand des DTrace-Stabilitätsmechanismus gemäß der folgenden Tabelle. Weitere Informationen zum Stabilitätsmechanismus finden Sie in Kapitel 39Stabilität.
Element |
Namensstabilität |
Datenstabilität |
Abhängigkeitsklasse |
---|---|---|---|
Provider |
Stable |
Stable |
Common |
Modul |
Private |
Private |
Unknown |
Funktion |
Private |
Private |
Unknown |
Name |
Stable |
Stable |
Common |
Argumente |
Stable |
Stable |
Common |