Manuel de suivi dynamique Solaris

Chapitre 17 Fournisseur dtrace

Le fournisseur dtrace offre plusieurs sondes liées à DTrace lui-même. Vous pouvez utiliser ces sondes pour initialiser l'état avant le début du suivi, procéder à son traitement, une fois le suivi effectué et gérer des erreurs d'exécution inattendues dans d'autres sondes.

Sonde BEGIN

La sonde BEGIN se déclenche avant toutes les autres. Aucune autre sonde ne se déclenche avant l'achèvement de toutes les clauses BEGIN. Cette sonde peut être utilisée pour initialiser n'importe quel état nécessaire dans d'autres sondes. L'exemple suivant illustre comment utiliser la sonde BEGIN pour initialiser un tableau associatif pour mapper entre des bits de protection mmap(2) et une représentation textuelle :

BEGIN
{
	prot[0] = "---";
	prot[1] = "r--";
	prot[2] = "-w-";
	prot[3] = "rw-";
	prot[4] = "--x";
	prot[5] = "r-x";
	prot[6] = "-wx";
	prot[7] = "rwx";
}

syscall::mmap:entry
{
	printf("mmap with prot = %s", prot[arg2 & 0x7]);
}

La sonde BEGIN se déclenche dans un contexte non spécifié. Cela signifie que la sortie de stack() ou ustack(), et la valeur de variables spécifiques au contexte (par exemple, execname), sont toutes arbitraires. Il convient de ne pas se fier à ces valeurs et de ne pas les interpréter en vue d'en tirer des informations significatives. Aucun argument n'est défini dans la sonde BEGIN.

La sonde END

La sonde ENDse déclenche après toutes les autres. Cette sonde ne se déclenche qu'à l'issue de l'achèvement de toutes les autres. Elle peut être utilisée pour procéder au traitement de l'état rassemblé ou pour formater la sortie. L'action printa() est par conséquent souvent utilisée dans la sonde END. Les sondes BEGIN et END peuvent être utilisées ensemble pour mesurer le temps total écoulé au cours du suivi :

BEGIN
{
	start = timestamp;
}

/*
 * ... other tracing actions...
 */

END
{
	printf("total time: %d secs", (timestamp - start) / 1000000000);
}

Pour connaître les autres utilisations courantes de la sonde END, reportez-vous aux sections Normalisation des données et printa().

De même qu'avec la sonde BEGIN, aucun argument n'est défini pour la sonde END. Le contexte dans lequel la sonde END se déclenche est arbitraire et il ne faut pas s'y fier.

Lors du suivi avec l'option bufpolicy définie sur fill, un espace approprié est réservé pour héberger les enregistrements suivis dans la sonde END. Pour de plus amples informations, reportez-vous à la section Stratégie fill et sondes END.


Remarque –

L'action exit() provoque l'arrêt du suivi et le déclenchement de la sondeEND. Toutefois, un certain délai est constaté entre l'appel de l'action exit() et le déclenchement de la sonde END. Pendant ce délai, aucune sonde ne se déclenche. Après qu'une sonde appelle l'action exit(), la sonde END ne se déclenche que lorsque le consommateur DTrace détermine que exit() a été appelée et qu'il procède à l'arrêt du suivi. La vitesse de vérification du statut de sortie peut être définie avec l'option statusrate. Pour plus d'informations, reportez-vous au Chapitre16Options et paramètres réglables.


Sonde ERROR

La sonde ERROR se déclenche lorsqu'une erreur d'exécution se produit lors du déclenchement d'une clause pour une sonde DTrace. Par exemple, si une clause tente de déréférencer un pointeur NULL, la sonde ERROR se déclenche, comme illustré dans l'exemple suivant.


Exemple 17–1 error.d: erreurs d'enregistrement

BEGIN
{
	*(char *)NULL;
}

ERROR
{
	printf("Hit an error!");
}

Lorsque vous exécutez ce programme, la sortie qui s'affiche est similaire à l'exemple suivant :


# dtrace -s ./error.d
dtrace: script './error.d' matched 2 probes
CPU     ID                    FUNCTION:NAME
  2      3                           :ERROR Hit an error!
dtrace: error on enabled probe ID 1 (ID 1: dtrace:::BEGIN): invalid address
(0x0) in action #1 at DIF offset 12
dtrace: 1 error on CPU 2

Le résultat montre que la sonde ERROR s'est déclenchée et illustre également dtrace(1M) consignant l'erreur dans un rapport. dtrace dispose de sa propre activation de la sonde ERROR pour lui permettre de consigner les erreurs dans un rapport. En utilisant la sonde ERROR, vous pouvez créer votre propre gestion d'erreurs personnalisée.

Les arguments vers la sondeERROR se présentent comme suit :

arg1

L'identificateur de sonde activée (EPID) de la sonde à l'origine de l'erreur.

arg2

L'index de l'action ayant provoqué l'erreur. 

arg3

Le décalage DIF de cette action ou -1 s'il ne s'applique pas.

arg4

Le type d'erreur. 

arg5

La valeur particulière de ce type d'erreur. 

Le tableau ci-dessous décrit les différents types d'erreur et la valeur que prend arg5 pour chacun :

Valeur arg4

Description 

Signification arg5

DTRACEFLT_UNKNOWN

Type d'erreur inconnu 

Aucune 

DTRACEFLT_BADADDR

Accès à une adresse non valide ou non mappée 

Adresse accédée 

DTRACEFLT_BADALIGN

Accès à une mémoire non alignée 

Adresse accédée 

DTRACEFLT_ILLOP

Opération non valide ou illégale 

Aucune 

DTRACEFLT_DIVZERO

Nombre entier divisé par zéro 

Aucune 

DTRACEFLT_NOSCRATCH

Espace de travail insuffisant pour répondre à l'allocation de travail 

Aucune 

DTRACEFLT_KPRIV

Tentative d'accès à une propriété ou une adresse de noyau avec des privilèges insuffisants. 

Adresse accédée ou 0 si cela ne s'applique pas.

DTRACEFLT_UPRIV

Tentative d'accès à une propriété ou une adresse utilisateur avec des privilèges insuffisants. 

Adresse accédée ou 0 si cela ne s'applique pas.

DTRACEFLT_TUPOFLOW

Dépassement de capacité de la pile du paramètre interne DTrace 

Aucune 

Si les actions effectuées dans la sonde ERROR elle-même sont à l'origine d'une erreur, celle-ci est abandonnée de manière silencieuse — la sonde ERROR n'est pas appelée récursivement.

Stabilité

Le fournisseur dtrace utilise le mécanisme de stabilité DTrace pour décrire ses stabilités, comme illustré dans le tableau suivant. Pour plus d'informations sur le mécanisme de stabilité, reportez-vous au Chapitre39Stabilité.

Élément 

Stabilité des noms 

Stabilité des données 

Classe de dépendance 

Fournisseur 

Stable 

Stable 

Commune

Module 

Privé 

Privé 

Inconnu 

Fonction 

Privé 

Privé 

Inconnu 

Nom 

Stable 

Stable 

Commune

Arguments 

Stable 

Stable 

Commune