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.
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 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.
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.
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.
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.
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 |