Handbuch zur dynamischen Ablaufverfolgung in Solaris

Externe Variablen

In D kommt das Backquote-Zeichen (oder Accent grave) (`) als spezieller Bereichsoperator zum Ansprechen von Variablen zum Einsatz, die zwar im Betriebssystem, nicht aber im D-Programm definiert sind. So enthält der Solaris-Kernel beispielsweise eine C-Deklaration eines über das System abstimmbaren Parameters (Tunables) namens kmem_flags zum Aktivieren von Debugging-Leistungsmerkmalen für die Speicherzuweisung. Im Solaris Tunable Parameters Reference Manual finden Sie weitere Informationen zu kmem_flags. Dieses Tunable ist im Kernel-Quellcode wie folgt als eine C-Variable deklariert:

int kmem_flags;

Um in einem D-Programm auf den Wert dieser Variable zuzugreifen, verwenden Sie die D-Notation:

`kmem_flags

DTrace weist jedem Kernelsymbol den im entsprechenden C-Betriebssystemcode für das Symbol verwendeten Typ zu und bietet dadurch einen einfachen quellcodebasierten Zugriff auf die nativen Datenstrukturen des Betriebssystems. Wenn Sie externe Betriebssystemvariablen einsetzen möchten, benötigen Sie Zugriff auf den entsprechenden Betriebssystemquellcode.

Mit dem Zugriff auf externe Variablen über ein D-Programm sprechen Sie die internen Implementierungsinformationen eines anderen Programms an, beispielsweise des Betriebssystemkernels oder dessen Gerätetreiber. Diese Implementierungsinformationen stellen keine stabile Schnittstelle dar, auf die Sie sich verlassen könnten! Mit D-Programmen, die von diesen Informationen abhängen, riskieren Sie, dass diese nach dem nächsten Upgrade der entsprechenden Software nicht mehr funktionsfähig sind. Aus diesem Grund werden externe Variablen in der Regel von Kernel- und Gerätetreiberentwicklern und von Wartungspersonal zum Aufspüren von Leistungs- oder Funktionsproblemen mit DTrace verwendet. Weitere Informationen über die Stabilität von D-Programmen finden Sie in Kapitel 39Stabilität.

Die Namen von Kernelsymbolen werden in einem von den D-Variablen- und Funktionsbezeichnern getrennten Namensraum gehalten, sodass keine Gefahr eines Konflikts zwischen diesen Namen und Ihren D-Variablen besteht. Stößt der D-Compiler auf eine Variable mit vorangestelltem Backquote-Zeichen, durchsucht er der Reihenfolge nach die bekannten Kernelsymbole unter Bezugnahme auf die Liste der geladenen Module nach einer passenden Variablendefinition. Da der Solaris-Kernel dynamisch geladene Module mit separaten Symbol-Namensräumen unterstützt, kann ein Variablenname im aktiven Betriebssystemkernel mehrmals verwendet werden. Diese Namenskonflikte können Sie lösen, indem Sie vor dem Backquote-Zeichen im Symbolnamen den Namen des Kernelmoduls angeben, auf dessen Variable zugegriffen werden soll. Beispielsweise bietet jedes ladbare Kernelmodul naturgemäß die Funktion _fini(9E), sodass Sie für die Bezugnahme auf die Adresse der Funktion _fini, die ein Kernelmodul namens foo zur Verfügung stellt, Folgendes schreiben würden:

foo`_fini

Alle beliebigen D-Operatoren außer denjenigen, die Werte ändern, können unter Beachtung der üblichen Regeln für Operandentypen auf externe Variablen angewendet werden. Wenn Sie DTrace starten, lädt der D-Compiler die für die aktiven Kernelmodule zutreffenden Variablennamen ein. Eine Deklaration dieser Variablen ist also nicht erforderlich. Operatoren wie beispielsweise = oder +=, die den Wert einer Variable ändern, dürfen nicht auf externe Variablen angewendet werden. Aus Sicherheitsgründen verhindert DTrace eine potenzielle Schädigung des Status der untersuchten Software.