Handbuch zur dynamischen Ablaufverfolgung in Solaris

Der Prüfpunkt ERROR

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.


Beispiel 17–1 error.d: Aufzeichnung von Fehlern

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.