Manuel de suivi dynamique Solaris

Ajout de sondes à une application

Les sondes DTrace dédiées aux bibliothèques et aux exécutables sont définies dans une section ELF du code binaire applicatif correspondant. Cette section décrit comment définir vos sondes, les ajouter au code source de votre application et augmenter le processus de construction de votre application pour intégrer les définitions des sondes DTrace.

Définition des fournisseurs et des sondes

Vous définissez les sondes DTrace dans un fichier source .d utilisé par la suite pour compiler et lier votre application. Commencez par attribuer un nom approprié au fournisseur de l'application utilisateur. Le nom de fournisseur que vous choisissez sera ajouté à un identificateur de processus pour chaque processus exécutant votre code d'application. Par exemple, si vous avez donné à un serveur Web exécuté sous l'ID de processus 1203 le nom de fournisseur myserv, le nom du fournisseur DTrace correspondant à ce processus sera myserv1203. Dans le fichier source .d, définissez le fournisseur comme dans l'exemple suivant :

provider myserv {
	...
};			

Ajoutez ensuite une définition pour chaque sonde et les arguments correspondants. L'exemple suivant définit les deux sondes présentées dans Choix des points de sonde. La première sonde possède deux arguments de type string tandis que la seconde n'en possède aucun. Le compilateur D convertit deux traits de soulignement consécutifs (__) en un tiret (-) dans le nom d'une sonde.

provider myserv {
	probe query__receive(string, string);
	probe query__respond();
};

Vous devez ajouter des attributs de stabilité à la définition de votre fournisseur pour que les utilisateurs de vos sondes sachent qu'il est probable que des changements interviennent dans les versions ultérieures de votre application. Pour plus d'informations sur les attributs de stabilité DTrace, reportez-vous au Chapitre39Stabilité. Les attributs de stabilité sont définis comme illustré dans l'exemple suivant :


Exemple 34–1 myserv.d : sondes d'application définies statiquement

#pragma D attributes Evolving/Evolving/Common provider myserv provider
#pragma D attributes Private/Private/Unknown provider myserv module
#pragma D attributes Private/Private/Unknown provider myserv function
#pragma D attributes Evolving/Evolving/Common provider myserv name
#pragma D attributes Evolving/Evolving/Common provider myserv args

provider myserv {
	probe query__receive(string, string);
	probe query__respond();
};


Remarque –

Les scripts en D utilisant des arguments non entiers à partir de sondes ajoutées par l'utilisateur doivent avoir recours aux fonctions copyin() et copyinstr() pour récupérer ces arguments. Pour plus d'informations, reportez-vous au Chapitre33Suivi des processus utilisateur.


Ajout de sondes à un code d'application

Une fois les sondes définies dans un fichier .d, vous devez augmenter votre code source pour indiquer leur position de déclenchement. Examinez l'exemple suivant de code source d'application C :

void
main_look(void)
{
	...
	query = wait_for_new_query();
	process_query(query)
	...
}

Pour ajouter un site de sondes, ajoutez une référence à la macro DTRACE_PROBE() définie dans <sys/sdt.h>, comme illustré dans l'exemple suivant :

#include <sys/sdt.h>
...

void
main_look(void)
{
	...
	query = wait_for_new_query();
	DTRACE_PROBE2(myserv, query__receive, query->clientname, query->msg);
	process_query(query)
	...
}

Le suffixe 2 du nom de la macro DTRACE_PROBE2 indique le nombre d'arguments transmis à la sonde. Les deux premiers arguments de la macro de la sonde correspondent au nom du fournisseur et au nom de la sonde. De ce fait, ils doivent être identiques à la définition de votre sonde et de votre fournisseur de langage D. Les arguments de macro restants sont ceux assignés aux variables arg0..9 de DTrace lors du déclenchement de la sonde. Le code source de votre application peut contenir plusieurs références au même nom de fournisseur et de sonde. Si plusieurs références à la même sonde figurent dans votre code source, elles sont toutes susceptibles de déclencher la sonde.

Création d'applications avec des sondes

Vous devez augmenter le processus de construction de votre application pour intégrer les définitions du fournisseur DTrace et des sondes. Un processus de construction type compile chaque fichier source de manière à créer un fichier objet correspondant. Les fichiers objets compilés sont ensuite liés entre eux pour créer le code d'application binaire terminé, comme illustré dans l'exemple suivant :


cc -c src1.c
cc -c src2.c
...
cc -o myserv src1.o src2.o ...

Pour intégrer les définitions de sonde DTrace à votre application, ajoutez les règles Makefile appropriées à votre processus de construction pour exécuter la commande dtrace, comme illustré dans l'exemple suivant :


cc -c src1.c
cc -c src2.c
...
dtrace -G -32 -s myserv.d src1.o src2.o ...
cc -o myserv myserv.o src1.o src2.o ...

La commande dtrace présentée ci-dessus assure le posttraitement des fichiers objets générés par les commandes précédentes du compilateur et génère le fichier objet myserv.o à partir de myserv.d et des autres fichiers objets. L'option dtrace -G permet de lier à une application utilisateur les définitions du fournisseur et des sondes. L'option - 32 permet de créer des codes binaires d'application 32 bits. L'option - 64 permet de créer des codes binaires d'application 64 bits.