Handbuch zur dynamischen Ablaufverfolgung in Solaris

Verwenden zwischenspeicherbarer Prädikate

DTrace-Prädikate dienen zum Herausfiltern unerwünschter Daten aus dem Experiment, indem nur Daten aufgezeichnet werden, die eine angegebene Bedingung erfüllen. Beim Aktivieren zahlreicher Prüfpunkte greift man im Allgemeinen auf Prädikate wie zum Beispiel /self->traceme/ oder /pid == 12345/ zurück, die einen oder mehrere spezifische Threads angeben. Obwohl viele dieser Prädikate für die meisten Threads in den meisten Prüfpunkten den Wert „falsch“ ergeben, kann die Auswertung selbst sehr aufwändig werden, wenn sie für tausende von Prüfpunkten erfolgen muss. Um diesen Aufwand herabzusetzen, speichert DTrace die Auswertung von Prädikaten, die nur thread-lokale (z. B. /self->traceme/) oder unveränderliche Variablen enthalten (z. B. /pid == 12345/) in einem Cache. Zwischengespeicherte Prädikate lassen sich unter wesentlich geringerem Aufwand auswerten als nicht zwischengespeicherte. Dies gilt insbesondere dann, wenn die Prädikate thread-lokale Variablen, Zeichenkettenvergleiche oder andere relativ aufwändige Operationen beinhalten. Die Zwischenspeicherung von Prädikaten ist für die Benutzer transparent, unterliegt aber den in der folgenden Tabelle aufgeführten Richtlinien zum Erzeugen optimaler Prädikate:

Zwischenspeicherbar 

Nicht zwischenspeicherbar 

self->mumble

mumble[curthread], mumble[pid, tid]

execname

curpsinfo->pr_fname, curthread->t_procp->p_user.u_comm

pid

curpsinfo->pr_pid, curthread->t_procp->p_pipd->pid_id

tid

curlwpsinfo->pr_lwpid, curthread->t_tid

curthread

curthread->beliebige Komponente, curlwpsinfo->beliebige Komponente, curpsinfo->beliebige Komponente

Das folgende Beispiel ist nicht empfehlenswert:

syscall::read:entry
{
	follow[pid, tid] = 1;
}

fbt:::
/follow[pid, tid]/
{}

syscall::read:return
/follow[pid, tid]/
{
	follow[pid, tid] = 0;
}

Das folgende Beispiel mit thread-lokalen Variablen ist dem obigen vorzuziehen:

syscall::read:entry
{
	self->follow = 1;
}

fbt:::
/self->follow/
{}

syscall::read:return
/self->follow/
{
	self->follow = 0;
}

Nur Prädikate, die ausschließlich aus zwischenspeicherbaren Ausdrücken bestehen, können selbst zwischengespeichert werden. Alle nachfolgenden Prädikate können zwischengespeichert werden:

/execname == "myprogram"/
/execname == $$1/
/pid == 12345/
/pid == $1/
/self->traceme == 1/

Die folgenden Beispiele mit globalen Variablen sind nicht zwischenspeicherbar:

/execname == one_to_watch/
/traceme[execname]/
/pid == pid_i_care_about/
/self->traceme == my_global/