Handbuch zur dynamischen Ablaufverfolgung in Solaris

Kapitel 17 Der Provider dtrace

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

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

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.


Hinweis –

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

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.

Stabilität

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