Handbuch zur dynamischen Ablaufverfolgung in Solaris

Variablen und arithmetische Ausdrücke

In unserem nächsten Beispielprogramm wird mit dem DTrace-Provider profile ein einfacher, auf der verstreichenden Zeit basierender Zähler implementiert. Dieser Provider hat die Fähigkeit, neue Prüfpunkte auf der Grundlage der im D-Programm enthaltenen Beschreibungen zu erstellen. Wenn Sie einen Prüfpunkt namens profile:::tick-nsec für die Ganzzahl n erstellen, generiert der Provider einen Prüfpunkt, der alle n Sekunden ausgelöst wird. Schreiben Sie den folgenden Quellcode und speichern Sie ihn in einer Datei namens counter.d:

/*
 * Count off and report the number of seconds elapsed
 */
dtrace:::BEGIN
{
	i = 0;
}

profile:::tick-1sec
{
	i = i + 1;
	trace(i);
}

dtrace:::END
{
	trace(i);
}

Wenn das Programm ausgeführt wird, werden die ablaufenden Sekunden gezählt, bis Sie Strg-C drücken, und anschließend wird die Gesamtzahl angezeigt:


# dtrace -s counter.d
dtrace: script 'counter.d' matched 3 probes
CPU     ID                    FUNCTION:NAME
  0  25499                       :tick-1sec         1
  0  25499                       :tick-1sec         2
  0  25499                       :tick-1sec         3
  0  25499                       :tick-1sec         4
  0  25499                       :tick-1sec         5
  0  25499                       :tick-1sec         6
^C
  0      2                             :END         6
#

Die ersten drei Programmzeilen sind ein Kommentar, aus dem die Funktion des Programms hervorgeht. Ähnlich wie in C, C++ und der Programmiersprache Java ignoriert der D-Compiler alle Zeichen zwischen den Symbolen /* und */. Kommentare sind an jeder Stelle in einem D-Programm zulässig, sowohl innerhalb als auch außerhalb der Prüfpunkt-Klausel.

Die Klausel für den Prüfpunkt BEGIN definiert eine neue Variable namens i und weist ihr mit folgender Anweisung den ganzzahligen Wert Null zu:

i = 0;

Im Gegensatz zu C, C++ und Java lassen sich D-Variablen einfach durch ihre Verwendung in einer Programmanweisung erzeugen. Es sind keine expliziten Variablendeklarationen erforderlich. Bei der ersten Verwendung einer Variablen in einem Programm wird der Variablentyp auf Grundlage der Art ihrer ersten Zuweisung festgelegt. Eine Variable kann im Verlauf der Programmlebensdauer nur einen Typ aufweisen. Nachfolgende Referenzen müssen also dem Typ der ersten Zuweisung entsprechen. In counter.d wird der Variable i zuerst die ganzzahlige Konstante Null zugewiesen. Sie wird deshalb auf den Datentyp int festgelegt. D bietet dieselben einfachen Integer-Datentypen wie C:

char

Zeichen oder Ganzzahl von 1 Byte 

int

Standard-Integer 

short

Kurze Ganzzahl 

long

Lange Ganzzahl 

long long

Sehr lange Ganzzahl 

Die Größen dieser Typen hängen von dem in Kapitel 2Typen, Operatoren und Ausdrücke beschriebenen Datenmodell des Betriebssystemkerns ab. Darüber hinaus bietet D integrierte einfache Namen für Integer-Typen mit und ohne Vorzeichen von unterschiedlicher, festgelegter Größe sowie Tausende anderer Typen, die vom Betriebssystem definiert werden.

Der zentrale Teil von counter.d ist die Prüfpunktklausel für die Erhöhung des Zählers i:

profile:::tick-1sec
{
	i = i + 1;
	trace(i);
}

Mit dieser Klausel wird der Prüfpunkt profile:::tick-1sec benannt. Dies weist den Provider profile an, einen neuen Prüfpunkt zu erzeugen, der einmal pro Sekunde auf einem verfügbaren Prozessor ausgelöst wird. Die Klausel enthält zwei Anweisungen. Die erste ordnet i den vorigen Wert plus 1 zu und die zweite überwacht den neuen Wert von i. In D sind alle aus C bekannten arithmetischen Operatoren verfügbar. Eine vollständige Liste finden Sie in Kapitel 2Typen, Operatoren und Ausdrücke. Ebenso wie in C kann der Operator ++ als Kurzform für die Erhöhung der entsprechenden Variable um 1 verwendet werden. Die Funktion trace() übernimmt jeden D-Ausdruck als Argument. counter.d ließe sich also auch knapper fassen:

profile:::tick-1sec
{
	trace(++i);
}

Wenn Sie den Typ der Variable i ausdrücklich festlegen möchten, können Sie den gewünschten Typ bei der Zuweisung einklammern, um die Ganzzahl Null ausdrücklich in einen bestimmten Typ umzuwandeln (Casting). Wenn Sie in D beispielsweise die maximale Größe einer char-Variable ermitteln möchten, könnten Sie die BEGIN-Klausel wie folgt ändern:

dtrace:::BEGIN
{
	i = (char)0;
}

Wenn Sie counter.d eine Weile laufen lassen, müssten Sie sehen, wie der überwachte Wert anwächst und schließlich wieder bei Null beginnt. Sollte Ihnen das zu lange dauern, ändern Sie den Namen des Prüfpunkts profile in profile:::tick-100msec ab. Dadurch erhalten Sie einen Zähler, der alle 100 Millisekunden (10-mal pro Sekunde) erhöht wird.