Handbuch zur dynamischen Ablaufverfolgung in Solaris

Makrovariablen

Der D-Compiler definiert einen Satz integrierter Makrovariablen, auf die Sie beim Schreiben von D-Programmen oder Interpreterdateien zurückgreifen können. Makrovariablen sind IDs mit einem vorangestellten Dollarzeichen ($), die bei der Verarbeitung der Eingabedatei einmal vom D-Compiler ersetzt werden. Der D-Compiler bietet die folgenden Makrovariablen:

Tabelle 15–1 D-Makrovariablen

Name 

Beschreibung 

Referenz 

$[0-9]+

Makroargumente 

Lesen Sie dazu Makroargumente

$egid

Effektive Gruppen-ID 

getegid(2)

$euid

Effektive Benutzer-ID 

geteuid(2)

$gid

Tatsächliche Gruppen-ID 

getgid(2)

$pid

Prozess-ID 

getpid(2)

$pgid

Prozess-Gruppen-ID 

getpgid(2)

$ppid

ID des übergeordneten Prozesses 

getppid(2)

$projid

Projekt-ID 

getprojid(2)

$sid

Sitzungs-ID 

getsid(2)

$target

ID des Zielprozesses 

Lesen Sie dazu ID des Zielprozesses

$taskid

Vorgangs-ID 

gettaskid(2)

$uid

Tatsächliche Benutzer-ID 

getuid(2)

Außer den Makroargumenten $[0-9]+ und der Makrovariable $target werden alle Makrovariablen durch die ganzzahligen Werte der Systemattribute wie beispielsweise Prozess-ID oder Benutzer-ID ersetzt. Die Variablen werden durch den Attributwert ersetzt, der entweder zu dem aktuellen dtrace-Prozess selbst oder dem den D-Compiler ausführenden Prozess gehört.

Durch den Einsatz von Makrovariablen in Interpreterdateien haben Sie die Möglichkeit, dauerhafte D-Programme zu erstellen, die Sie nicht bei jeder Verwendung neu bearbeiten müssen. Wenn Sie beispielsweise alle Systemaufrufe außer den vom Befehl dtrace ausgeführten zählen möchten, können Sie die folgende D-Programmklausel mit $pid verwenden:

syscall:::entry
/pid != $pid/
{
	@calls = count();
}

Diese Klausel bringt immer das gewünschte Ergebnis, obwohl jeder Aufruf des Befehls dtrace eine andere Prozess-ID haben wird.

Makrovariablen können überall dort in einem D-Programm verwendet werden, wo Ganzzahlen, IDs oder Zeichenketten erlaubt sind. Sie werden nur einmal (d. h. nicht rekursiv) bei der Analyse der Eingabedatei ersetzt. Alle Makrovariablen werden durch separate Eingabesymbole ersetzt und können nicht mit zusätzlichem Text verkettet werden, um ein einzelnes Symbol zu bilden. Wenn beispielsweise $pid durch den Wert 456 ersetzt wird, dann wird der D-Code:

123$pid

nicht als das einzelne, ganzzahlige Symbol 123456, sondern als zwei nebeneinander stehende Symbole 123 und 456 gewertet und ergibt einen Syntaxfehler.

Makrovariablen werden ersetzt und mit angrenzendem Text innerhalb von D-Prüfpunktbeschreibungen am Anfang der Programmklauseln verkettet. In der folgenden Klausel wird beispielsweise mit dem DTrace-Provider pid der Befehl dtrace instrumentiert:

pid$pid:libc.so:printf:entry
{
	...
}

Makrovariablen werden nur einmal in jedem Prüfpunktbeschreibungsfeld ersetzt; sie dürfen keine Begrenzungszeichen für Prüfpunktbeschreibungen (:) enthalten.