Handbuch zur dynamischen Ablaufverfolgung in Solaris

Erste Schritte

DTrace hilft Ihnen, Softwaresysteme genau zu verstehen, indem Sie den Betriebssystemkernel und Benutzerprozesse dynamisch so verändern, dass an Stellen besonderen Interesses, den so genannten Prüfpunkten, zusätzliche, von Ihnen angegebene Informationen aufgezeichnet werden. Ein Prüfpunkt ist eine Stelle oder eine Aktivität, an die DTrace eine Anforderung zur Durchführung einer Gruppe von Aktionen binden kann. Dabei kann es sich beispielsweise um die Aufzeichnung eines Stackprotokolls, einer Zeitmarke oder des Arguments einer Funktion handeln. Prüfpunkte sind mit programmierbaren Sensoren oder Messfühlern vergleichbar, die an interessanten Stellen im gesamten Solaris-System zu finden sind. Wenn Sie einer Sache auf den Grund gehen möchten, programmieren Sie mit DTrace die entsprechenden Sensoren so, dass die für Sie interessanten Informationen aufgezeichnet werden. Wenn anschließend die Prüfpunkte ausgelöst werden, werden die Daten der Prüfpunkte von DTrace abgerufen und an Sie ausgegeben. Wenn Sie für einen Prüfpunkt keine Aktion festlegen, verzeichnet DTrace lediglich, wie oft der Prüfpunkt ausgelöst wird.

Jeder Prüfpunkt in DTrace besitzt zwei Namen: eine eindeutige, ganzzahlige ID und einen vom Menschen lesbaren textuellen Namen. Zum Erlernen von DTrace sollen zunächst einige sehr einfache Anforderungen mit dem Prüfpunkt namens BEGIN erzeugt werden, der zu Beginn jeder neuen Tracing-Anforderung einmal ausgelöst wird. Mit der Option des Dienstprogrammsdtrace(1M) lässt -n sich ein Prüfpunkt über seinen Zeichenfolgennamen aktivieren. Geben Sie den folgenden Befehl ein:


# dtrace -n BEGIN

Nach einer kurzen Pause wird Ihnen von DTrace mitgeteilt, dass ein Prüfpunkt aktiviert wurde, und Sie sehen eine Ausgabezeile, die auf die Auslösung des Prüfpunkts BEGIN hinweist. Wenn diese Ausgabe erscheint, wartet dtrace darauf, dass weitere Prüfpunkte ausgelöst werden. Da Sie keine weiteren Prüfpunkte aktiviert haben und BEGIN nur einmal ausgelöst wird, drücken Sie in Ihrer Befehls-Shell die Tastenkombination Strg-C, um dtrace zu beenden und zur Shell-Eingabeaufforderung zurückzukehren:


# dtrace -n BEGIN
dtrace: description 'BEGIN' matched 1 probe
CPU     ID		      FUNCTION:NAME
  0      1                  :BEGIN
^C
#

An der Ausgabe erkennen Sie, dass der Prüfpunkt namens BEGIN einmal ausgelöst wurde. Sie enthält sowohl die ganzzahlige ID als auch den Namen des Prüfpunkts. Standardmäßig wird die numerische Bezeichnung der CPU angezeigt, auf der der Prüfpunkt ausgelöst wird. In diesem Beispiel geht aus der Spalte „CPU“ hervor, dass der Befehl dtrace bei Auslösung des Prüfpunkts auf CPU 0 ausgeführt wurde.

Sie können DTrace-Anforderungen mit beliebig vielen Prüfpunkten und Aktionen erstellen. Formulieren Sie nun eine einfache Anforderung mit zwei Prüfpunkten, indem Sie dem vorigen Beispielbefehl den Prüfpunkt END hinzufügen. Der Prüfpunkt END wird einmal zum Abschluss der Ablaufverfolgung ausgelöst. Geben Sie den folgenden Befehl ein und drücken Sie nach der Ausgabezeile für den Prüfpunkt BEGIN erneut Strg-C in Ihrer Befehls-Shell:


# dtrace -n BEGIN -n END
dtrace: description 'BEGIN' matched 1 probe
dtrace: description 'END' matched 1 probe
CPU     ID		      FUNCTION:NAME
  0      1                  :BEGIN
^C
  0      2                    :END
#

Sie sehen, dass die Betätigung von Strg-C zum Beenden von dtrace den Prüfpunkt END auslöst. dtrace meldet die Auslösung dieses Prüfpunkts und wird beendet.

Nachdem Sie sich jetzt ein wenig mit der Benennung und Aktivierung von Prüfpunkten angefreundet haben, sind Sie bereit, die DTrace-Version des klassischen Einsteigerprogramms „Hello, World“ zu schreiben. DTrace-Versuche lassen sich nicht nur in der Befehlszeile erstellen, sondern auch in der Programmiersprache D in Textdateien schreiben. Erstellen Sie in einem Texteditor eine neue Datei mit dem Namen hello.d und geben Sie Ihr erstes D-Programm ein:


Beispiel 1–1 hello.d: „Hello, World“ in der Programmiersprache D

BEGIN
{
	trace("hello, world");
	exit(0);
}

Nachdem Sie das Programm gespeichert haben, können Sie es mit der dtrace-Option -s ausführen. Geben Sie den folgenden Befehl ein:


# dtrace -s hello.d
dtrace: script 'hello.d' matched 1 probe
CPU     ID		      FUNCTION:NAME
  0	    1                  :BEGIN   hello, world
#

Wie Sie sehen, generiert dtrace dieselbe Ausgabe wie zuvor, gefolgt von dem Text „hello, world”. Im Gegensatz zum vorherigen Beispiel mussten Sie diesmal weder warten noch Strg-C drücken. Diese Abweichungen sind das Ergebnis der Aktionen, die Sie in hello.d für den Prüfpunkt BEGIN angegeben haben. Um verstehen zu können, was hier vor sich gegangen ist, müssen wir uns die Struktur des D-Programms genauer anschauen.

Jedes D-Programm besteht aus einer Folge von Klauseln, die je einen oder mehrere zu aktivierende Prüfpunkte beschreiben, und einem optionalen Satz Aktionen, die bei Auslösung des Prüfpunkts durchgeführt werden sollen. Die Aktionen werden nach dem Namen des Prüfpunkts als eine Reihe von Anweisungen in geschweiften Klammern { } aufgelistet. Jede Anweisung endet mit einem Strichpunkt (;). In Ihrer ersten Anweisung kommt die Funktion trace() zum Einsatz. Mit ihr weisen Sie DTrace an, das angegebene Argument, die Zeichenkette „hello, world”, bei Auslösung des Prüfpunkts BEGIN aufzuzeichnen und anschließend auszugeben. In der zweiten Anweisung verwenden Sie die Funktion exit(), um die Ablaufverfolgung mit DTrace abzubrechen und den Befehl dtrace zu beenden. DTrace bietet einen Satz hilfreicher Funktionen wie trace() und exit(), die Sie in Ihren D-Programmen aufrufen können. Sie rufen eine Funktion auf, indem Sie ihren Namen, gefolgt von einer in Klammern stehenden Liste von Argumenten angeben. Alle D-Funktionen werden in Kapitel 10Aktionen und Subroutinen beschrieben.

Wenn Sie mit der Programmiersprache C vertraut sind, haben Sie an dem Namen und unseren Beispielen mittlerweile sicherlich festgestellt, dass sie der DTrace-Programmiersprache D sehr ähnlich ist. Tatsächlich ist D eine Ableitung eines sehr weiten Teilsatzes von C, kombiniert mit einem speziellen, die Ablaufverfolgung erleichternden Funktions- und Variablensatz. In den nachfolgenden Kapiteln werden Sie mehr über diese Leistungsmerkmale erfahren. Wenn Sie schon einmal ein C-Programm geschrieben haben, können Sie Ihr Wissen großteilig unmittelbar auf die Erstellung von Ablaufverfolgungsprogrammen in D übertragen. Aber selbst wenn Sie noch nie ein C-Programm geschrieben haben, lässt sich D sehr leicht erlernen. In diesem Kapitel wird Ihnen die gesamte Syntax verständlich gemacht. Lassen Sie uns aber zunächst noch einmal von den Sprachregeln zur Funktionsweise von DTrace und anschließend zum Erstellen etwas interessanterer D-Programme zurückkehren.