Handbuch zur dynamischen Ablaufverfolgung in Solaris

Makroargumente

Der D-Compiler bietet auch einen Satz Makrovariablen für alle zusätzlichen als Teil des dtrace-Befehlsaufrufs angegebenen Argument-Operanden. Auf diese Makroargumente wird über die integrierten Namen zugegriffen: $0 für den Namen der D-Programmdatei oder des dtrace-Befehls, $1 für den ersten zusätzlichen Operanden, $2 für den zweiten Operanden und so weiter. Wenn Sie die dtrace-Option -s verwenden, wird $0 durch den Wert des Namens der mit dieser Option verwendeten Eingabedatei ersetzt. Bei D-Programmen, die in der Befehlszeile angegeben werden, nimmt $0 den Wert von argv[0] an, das zum Ausführen von dtrace selbst verwendet wurde.

Makroargumente können in Abhängigkeit von der Form des zugehörigen Texts durch Ganzzahlen, IDs oder Zeichenketten ersetzt werden. Wie alle Makrovariablen können auch Makroargumente über all dort in einem D-Programm verwendet werden, wo Symbole in Form von Ganzzahlen, IDs und Zeichenketten zulässig sind. Alle nachfolgenden Beispiele könnten gültige D-Ausdrücke bilden, geeignete Makroargumentwerte vorausgesetzt:

execname == $1    /* with a string macro argument */
x += $1           /* with an integer macro argument */
trace(x->$1)      /* with an identifier macro argument */

Makroargumente können zum Erstellen von dtrace-Interpreterdateien eingesetzt werden, die als regelrechte Solaris-Befehle fungieren und Informationen verwenden, die von einem Benutzer oder einem anderen Tool angegeben werden, um deren Verhalten zu modifizieren. So zeichnet beispielsweise die folgende D-Interpreterdatei die durch einen bestimmten Prozess (ID) ausgeführten write(2)-Systemaufrufe auf:

#!/usr/sbin/dtrace -s

syscall::write:entry
/pid == $1/
{
}

Wenn Sie diese Interpreterdatei als ausführbar kennzeichnen, können Sie der Interpreterdatei den Wert von $1 über ein zusätzliches Befehlszeilenargument mitteilen:


# chmod a+rx ./tracewrite
# ./tracewrite 12345

Der entstehende Befehlsaufruf zählt alle durch den Prozess mit der ID 12345 ausgeführten write(2)-Systemaufrufe.

Verweist Ihr D-Programm auf ein nicht in der Befehlszeile angegebenes Makroargument, wird eine entsprechende Fehlermeldung ausgegeben und die Programmkompilierung schlägt fehl:


# ./tracewrite
dtrace: failed to compile script ./tracewrite: line 4:
  macro argument $1 is not defined

Wurde die Option defaultargs gesetzt, ist die Referenzierung nicht angegebener Makroargumente durch das Programm möglich. Wenn defaultargs gesetzt ist, nehmen die nicht angegebenen Argumente den Wert 0 an. Weitere Informationen zu den Optionen des D-Compilers finden Sie in Kapitel 16Optionen und Tunables . Der D-Compiler gibt auch dann eine Fehlermeldung aus, wenn in der Befehlszeile zusätzliche Argumente angegeben sind, auf die das D-Programm nicht verweist.

Die Werte der Makroargumente müssen mit der Form einer Ganzzahl, ID oder Zeichenkette übereinstimmen. Stimmt das Argument mit keiner dieser Formen überein, meldet der D-Compiler einen entsprechenden Fehler. Wenn Sie einer DTrace-Interpreterdatei ein Zeichenketten-Makroargument übergeben, schließen Sie das Argument in ein zusätzliches Paar einfacher Anführungszeichen ein, damit die Shell nicht den Inhalt der doppelten Anführungszeichen und der Zeichenkette interpretiert:


# ./foo '"a string argument"'

Wenn die D-Makroargumente als Zeichenketten-Symbole interpretiert werden sollen, obwohl sie mit der Form einer Ganzzahl oder ID übereinstimmen, stellen Sie dem Namen der Makrovariable oder des Arguments zwei Dollarzeichen voran (z. B. $$1). Dadurch wird der D-Compiler gezwungen, die Argumentwerte wie eine in doppelten Anführungszeichen eingeschlossene Zeichenkette zu interpretieren. Alle in D üblichen Ersatzdarstellungen für Zeichenketten (siehe Tabelle 2–5) werden innerhalb von etwaigen Zeichenketten-Makroargumenten aufgelöst. Dabei spielt es keine Rolle, ob sie in der Makroform $Arg oder $$Arg referenziert werden. Wenn die Option defaultargs gesetzt ist, nehmen nicht angegebene Argumente, auf die in der Form $$Arg verwiesen wird, den Wert der leeren Zeichenkette ("") an.