Manuel de suivi dynamique Solaris

Arguments de macro

Le compilateur D fournit également un ensemble de variables de macro correspondant à tous les opérandes d'argument supplémentaires spécifiés dans le cadre de l'invocation de la commande dtrace. Il est possible d'accéder à ces arguments de macro en utilisant les noms $0 intégrés comme nom de fichier du programme en D ou de la commande dtrace, $1 pour le premier opérande supplémentaire, $2 pour le second opérande, etc. Si vous utilisez l'option dtrace -s, $0 est étendu à la valeur du nom du fichier d'entrée utilisé avec cette option. Pour les programmes en D spécifiés sur la ligne de commande, $0 est étendu à la valeur de argv[0] utilisée pour exécuter dtrace lui-même.

Les arguments de macro peuvent être étendus aux nombres entiers, aux identificateurs ou aux chaînes en fonction de la forme du texte correspondant. De même que toutes les variables de macro, vous pouvez utiliser les arguments de macro partout où vous pouvez utiliser des jetons de nombre entier, d'identificateur ou de chaîne dans un programme en D. Tous les exemples suivants peuvent constituer des expressions en D valides en adoptant des valeurs d'argument de macro appropriées :

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

Vous pouvez utiliser les arguments de macro pour créer des fichiers interpréteurs dtrace qui agissent comme de vraies commandes Solaris et modifient leur comportement à l'aide des informations spécifiées par un utilisateur ou un autre outil. Par exemple, le fichier interpréteur en D suit les appels système write(2) exécutés par un ID de processus particulier :

#!/usr/sbin/dtrace -s

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

Si vous rendez ce fichier interpréteur exécutable, vous pouvez spécifier la valeur de $1 à l'aide d'un argument de ligne de commande supplémentaire dans votre fichier interpréteur :


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

L'invocation de commande qui en résulte compte chaque appel système write(2) exécuté par l'ID de processus 12345.

Si votre programme en D référence un argument de macro ne figurant pas sur la ligne de commande, un message d'erreur approprié est imprimé et la compilation de votre programme échoue :


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

Les programmes en D peuvent référencer des arguments de macro non spécifiés si l'option defaultargs est définie. Si l'option defaultargs est définie, les arguments non spécifiés ont la valeur 0. Pour plus d'informations sur les options du compilateur D, reportez-vous au Chapitre16Options et paramètres réglables. Le compilateur D engendre également un message d'erreur si d'autres arguments spécifiés sur la ligne de commande ne sont pas référencés par votre programme en D.

Les valeurs des arguments de commande doivent correspondre à la forme d'un nombre entier, d'un identificateur ou d'une chaîne. Si l'argument ne correspond pas à l'un de ces formats, le compilateur D envoie un message d'erreur approprié. Lorsque vous spécifiez des arguments de macro au format chaîne dans un fichier interpréteur DTrace, ajoutez une paire de guillemets simples supplémentaires pour éviter que les guillemets doubles et le contenu des chaînes ne soient interprétés par votre shell :


# ./foo '"a string argument"'

Si vous souhaitez que vos arguments de macro en D soient interprétés comme des jetons de chaîne, y compris avec un format de nombre entier ou d'identificateur, ajoutez deux symboles dollar en préfixe au nom de l'argument ou de la variable de macro (par exemple, $$1) pour contraindre le compilateur D à interpréter la valeur de l'argument comme une chaîne entre guillemets doubles. Toutes les séquences d'échappement de chaîne en D usuelles (voir le Tableau 2–5) sont étendues à l'intérieur de n'importe quel argument de macro au format chaîne, qu'elles soient référencées sous la forme $arg ou $$arg de la macro. Si l'option defaultargs est définie, les arguments non spécifiés au format $$arg possèdent la valeur d'une chaîne vide ("").