Handbuch zur dynamischen Ablaufverfolgung in Solaris

Arbeiten mit Spekulationen

Wenn Sie eine Spekulation benutzen möchten, müssen Sie der Funktion speculate() vor() jeglichen Daten aufzeichnenden Aktionen in einer Klausel eine von der Funktion speculation zurückgegebene ID übergeben. Alle nachfolgenden Daten aufzeichnenden Aktionen in einer Klausel, die eine speculate()-Funktion enthält, werden spekulativ verfolgt. Sollte ein Aufruf von speculate() in einer D-Prüfpunktklausel hinter Daten aufzeichnenden Aktionen stehen, generiert der D-Compiler einen Kompilierungszeitfehler. Aus diesem Grund dürfen Klauseln entweder spekulative oder nicht spekulative Ablaufverfolgungsanforderungen enthalten, nicht aber beides.

Aggregataktionen, destruktive Aktionen und die Aktion exit sind keinesfalls spekulativ. Jeder Versuch, eine dieser Aktionen in eine Klausel aufzunehmen, die eine speculate()-Funktion enthält, ergibt einen Kompilierzeitfehler. speculate() darf nicht auf speculate() folgen: Pro Klausel ist nur eine Spekulation zulässig. Eine Klausel, die nur eine speculate()-Funktion enthält, nimmt eine spekulative Ablaufverfolgung der Standardaktion vor, die nach Vereinbarung nur die aktivierte Prüfpunkt-ID verfolgt. Eine Beschreibung der Standardaktion finden Sie in Kapitel 10Aktionen und Subroutinen.

Im Normalfall weisen wir das Ergebnis einer speculation() einer thread-lokalen Variable zu und setzen diese Variable dann als nachfolgendes Prädikat für andere Prüfpunkte sowie als Argument für speculate() ein. Beispiel:

syscall::open:entry
{
	self->spec = speculation();
}

syscall:::
/self->spec/
{
	speculate(self->spec);
	printf("this is speculative");
}