Handbuch zur dynamischen Ablaufverfolgung in Solaris

Stabilitätsberechnung und -berichte

Der D-Compiler stellt für jede Prüfpunktbeschreibung und Aktionsanweisung in Ihren D-Programmen Stabilitätsberechnungen an. Mit der dtrace-Option -v erhalten Sie einen Bericht über die Stabilität eines Programms. Das folgende Beispiel zeigt ein in der Befehlszeile geschriebenes Programm:


# dtrace -v -n dtrace:::BEGIN'{exit(0);}'
dtrace: description 'dtrace:::BEGIN' matched 1 probe
Stability data for description dtrace:::BEGIN:
        Minimum probe description attributes
                Identifier Names: Evolving
                Data Semantics:   Evolving
                Dependency Class: Common
        Minimum probe statement attributes
                Identifier Names: Stable
                Data Semantics:   Stable
                Dependency Class: Common
CPU     ID                    FUNCTION:NAME
  0      1                           :BEGIN

Außerdem lässt sich die dtrace-Option -v mit der Option -e kombinieren, wodurch dtrace das D-Programm zwar kompiliert, aber nicht ausführt und Sie die Programmstabilität ermitteln können, ohne dafür Prüfpunkte aktivieren und das Programm ausführen zu müssen. Ein weiteres Beispiel für einen Stabilitätsbericht:


# dtrace -ev -n dtrace:::BEGIN'{trace(curthread->t_procp);}'
Stability data for description dtrace:::BEGIN:
        Minimum probe description attributes
                Identifier Names: Evolving
                Data Semantics:   Evolving
                Dependency Class: Common
        Minimum probe statement attributes
                Identifier Names: Stable
                Data Semantics:   Private
                Dependency Class: Common
#

Beachten Sie, dass in dem neuen Programm die D-Variable curthread referenziert wird, deren Namensstabilität „Stable“, ihre Datensemantik jedoch „Private“ ist (d. h. Sie greifen auf private Implementierungsdetails des Kernels zu). Dieser Zustand wird im Stabilitätsbericht des Programms wiedergegeben. Zur Berechnung der Stabilitätsattribute im Programmbericht werden aus den entsprechenden Werten für jede Dreiergruppe an Schnittstellenattributen die niedrigste Stabilitätsstufe und Klasse ausgewählt.

Stabilitätsattribute für Prüfpunktbeschreibungen errechnen sich aus den geringsten Stabilitätsattributen aller angegebenen Prüfpunktbeschreibungsfelder entsprechend den vom Provider veröffentlichten Attributen. Die Attribute der verfügbaren DTrace-Provider sind in den Kapiteln über die einzelnen Provider aufgeführt. DTrace-Provider exportieren für jedes der vier Beschreibungsfelder aller von diesem Provider veröffentlichten Prüfpunkte eine Dreiergruppe von Stabilitätsattributen. Ein Providername weist deshalb u. U. eine höhere Stabilität auf als die einzelnen Prüfpunkte, die er exportiert. So hat zum Beispiel die Prüfpunktbeschreibung:

fbt:::

(sie gibt an, dass DTrace den Eintritt in und die Rückkehr aus allen Kernelfunktionen verfolgen soll) eine größere Stabilität als die Prüfpunktbeschreibung:

fbt:foo:bar:entry

die eine spezifische interne bar()-Funktion im Kernelmodul foo angibt. Der Einfachheit halber versehen die meisten Provider alle von ihnen veröffentlichten Modul:Funktion:Name-Werte mit nur einem Attributsatz. Außerdem geben Provider Attribute für den Vektor args[] bekannt, denn die Stabilität aller Prüfpunktargumente variiert von Provider zu Provider.

Sollte das Providerfeld in einer Prüfpunktbeschreibung nicht angegeben sein, werden der Beschreibung die Stabilitätsattribute Unstable/Unstable/Common zugewiesen, da die Beschreibung beim Einsatz unter einer künftigen Solaris-Version möglicherweise auf Prüfpunkte von Providern zutrifft, die bisher noch nicht existieren. Über die Zukunft des Programms im Hinblick auf Stabilität und Verhalten kann Sun keine Garantien aussprechen. Provider sollten beim Schreiben von D-Programmklauseln stets explizit angegeben werden. Darüber hinaus werden Prüfpunktbeschreibungsfelder, die Mustervergleichszeichen (siehe Kapitel 4D-Programmstruktur) oder Makrovariablen wie $ 15 (siehe Kapitel 15Scripting) enthalten, als unbestimmte Felder behandelt, da diese Beschreibungsmuster auf Provider oder Prüfpunkte zutreffen könnten, die Sun in künftigen Versionen von DTrace oder des Betriebssystems Solaris herausgeben kann.

Für die meisten D-Anweisungen errechnen sich die Stabilitätsattribute aus der niedrigsten Stabilität und Klasse der Größen in der Anweisung. Die folgenden D-Größen besitzen beispielsweise diese Attribute:

Größe 

Attribute 

In D integrierte Variable curthread

Stable/Private/Common 

Benutzerdefinierte D-Variable x

Stable/Stable/Common 

Wenn Sie die folgende D-Programmanweisung schreiben:

x += curthread->t_pri;

erhalten die Anweisungen die Attribute Stable/Private/Common, also die niedrigsten Attribute der Operanden curthread und x. Die Stabilität eines Ausdrucks errechnet sich aus den geringsten Stabilitätsattributen aller Operanden.

Allen D-Variablen, die Sie in einem Programm definieren, werden automatisch die Attribute Stable/Stable/Common zugewiesen. Außerdem werden der D-Grammatik sowie den D-Operatoren implizit die Attribute Stable/Stable/Common zugewiesen. Verweise auf Kernelsymbole anhand des Backquote-Operators (`) stellen Artefakte der Implementierung dar und erhalten als solche stets die Attribute Private/Private/Unknown. Den in Ihrem D-Programmquellcode definierten Typen, insbesondere solchen aus Namensräumen für C- und D-Typen, werden die Attribute Stable/Stable/Common zugewiesen. Typen, die in der Betriebssystemimplementierung definiert sind und von Namensräumen für andere Typen bereitgestellt werden, erhalten die Attribute Private/Private/Unknown. Der D-Operator für die explizite Typumwandlung ergibt einen Ausdruck, dessen Stabilitätsattribute sich aus den niedrigsten Attributen des Eingangsausdrucks und den Attributen des explizit umgewandelten Ausgangstyps ableiten.

Wenn Sie mit dem C-Preprozessor C-Systemdefinitionsdateien aufnehmen, werden diese Typen dem Namensraum für C-Typen zugeordnet und erhalten die Attribute Stable/Stable/Common, da der D-Compiler davon ausgehen muss, dass Sie die Verantwortung für diese Deklarationen übernehmen. Folglich ist es denkbar, dass Sie sich im Hinblick auf die Stabilität Ihrer Programme selbst in die Irre führen, wenn Sie den C-Preprozessor verwenden, um eine Definitionsdatei mit Implementierungsartefakten aufzunehmen. Um die richtigen Stabilitätsstufen zu bestimmen, sollten Sie stets die Dokumentation zu den verwendeten Definitionsdateien zu Rate ziehen.