Ce chapitre décrit le suivi anonyme, c'est-à-dire le suivi qui n'est associé à aucun consommateur DTrace. Le suivi anonyme est utilisé dans les situations dans lesquelles aucun processus de consommateur DTrace ne peut s'exécuter. Le suivi anonyme est le plus souvent utilisé pour permettre aux développeurs de pilotes de périphériques de déboguer et de suivre les activités qui surviennent pendant l'initialisation du système. Tous les suivis pouvant être effectués de manière interactive peuvent l'être de manière anonyme. Toutefois, seul le superutilisateur peut créer une activation anonyme et il ne peut en exister qu'une à la fois.
Pour créer une activation anonyme, utilisez l'option -A avec un appel dtrace(1M) spécifiant les sondes, prédicats, actions et options requis. dtrace ajoute une série de propriétés de pilote correspondant à votre requête à la configuration du pilote dtrace(7D), généralement /kernel/drv/dtrace.conf. Ces propriétés sont lues par le pilote dtrace(7D) lors de son chargement. Le pilote active les sondes spécifiées et crée un état anonyme à associer avec la nouvelle activation. Habituellement, le pilote dtrace(7D) est chargé à la demande, à l'instar de tous les pilotes agissant en qualité de fournisseurs DTrace. Pour autoriser le suivi pendant l'initialisation, le pilote dtrace(7D) doit être chargé le plus tôt possible. dtrace ajoute les instructions forceload nécessaires à /etc/system (consultez system(4)) pour chaque fournisseur DTrace et pour dtrace(7D) lui-même.
Ensuite, lors de l'initialisation du système, un message est émis par dtrace(7D) pour indiquer que le fichier de configuration a été traité correctement.
Toutes les options peuvent être définies par une activation anonyme, notamment la taille du tampon, la taille de variable dynamique, la taille de spéculation, le nombre de spéculations, etc.
Pour supprimer une activation anonyme, spécifiez -A dans dtrace sans description de sonde.
Dès que la machine est complètement initialisée, n'importe quel état anonyme peut être demandé en spécifiant l'option -a avec dtrace. Par défaut, -a demande l'état anonyme, traite les données existantes et poursuit l'exécution. Pour consommer l'état anonyme puis quitter le programme, ajoutez l'option -e.
Dès que l'état anonyme est consommé depuis le noyau, il ne peut pas être remplacé : les tampons internes au noyau qui le contiennent sont réutilisés. En cas de tentative d'une demande d'état de suivi anonyme lorsqu'il n'en existe aucun,dtrace génère un message similaire à l'exemple suivant :
dtrace: could not enable tracing: No anonymous tracing state |
Si des abandons ou des erreurs se sont produits, dtrace génère les messages appropriés lors de la demande d'état anonyme. Les messages d'abandons et d'erreurs sont les mêmes qu'il s'agisse d'un état anonyme ou non.
L'exemple suivant illustre une activation anonyme DTrace pour chaque sonde du module iprb(7D) :
# dtrace -A -m iprb dtrace: saved anonymous enabling in /kernel/drv/dtrace.conf dtrace: added forceload directives to /etc/system dtrace: run update_drv(1M) or reboot to enable changes # reboot |
Au terme de la réinitialisation, dtrace(7D) affiche un message sur la console permettant d'activer les sondes spécifiées.
... Copyright 1983-2003 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. NOTICE: enabling probe 0 (:iprb::) NOTICE: enabling probe 1 (dtrace:::ERROR) configuring IPv4 interfaces: iprb0. ... |
Lors de la réinitialisation de la machine, l'état anonyme peut être consommé en spécifiant l'option -a avec dtrace :
# dtrace -a CPU ID FUNCTION:NAME 0 22954 _init:entry 0 22955 _init:return 0 22800 iprbprobe:entry 0 22934 iprb_get_dev_type:entry 0 22935 iprb_get_dev_type:return 0 22801 iprbprobe:return 0 22802 iprbattach:entry 0 22874 iprb_getprop:entry 0 22875 iprb_getprop:return 0 22934 iprb_get_dev_type:entry 0 22935 iprb_get_dev_type:return 0 22870 iprb_self_test:entry 0 22871 iprb_self_test:return 0 22958 iprb_hard_reset:entry 0 22959 iprb_hard_reset:return 0 22862 iprb_get_eeprom_size:entry 0 22826 iprb_shiftout:entry 0 22828 iprb_raiseclock:entry 0 22829 iprb_raiseclock:return ... |
L'exemple suivant se concentre uniquement sur les fonctions appelées depuis iprbattach(). Dans un éditeur, tapez le script suivant et enregistrez-le dans un fichier appelé iprb.d.
fbt::iprbattach:entry { self->trace = 1; } fbt::: /self->trace/ {} fbt::iprbattach:return { self->trace = 0; }
Exécutez les commandes suivantes pour effacer les paramètres précédents du fichier de configuration du pilote, installez la requête de suivi anonyme et réinitialisez.
# dtrace -AFs iprb.d dtrace: cleaned up old anonymous enabling in /kernel/drv/dtrace.conf dtrace: cleaned up forceload directives in /etc/system dtrace: saved anonymous enabling in /kernel/drv/dtrace.conf dtrace: added forceload directives to /etc/system dtrace: run update_drv(1M) or reboot to enable changes # reboot |
À l'issue de la réinitialisation, dtrace(7D) affiche un message différent sur la console pour indiquer l'activation légèrement différente :
... Copyright 1983-2003 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. NOTICE: enabling probe 0 (fbt::iprbattach:entry) NOTICE: enabling probe 1 (fbt:::) NOTICE: enabling probe 2 (fbt::iprbattach:return) NOTICE: enabling probe 3 (dtrace:::ERROR) configuring IPv4 interfaces: iprb0. ... |
Une fois que la machine est complètement réinitialisée, exécutez dtrace avec l'option -a et l'option -e pour consommer les données anonymes puis quitter le programme.
# dtrace -ae CPU FUNCTION 0 -> iprbattach 0 -> gld_mac_alloc 0 -> kmem_zalloc 0 -> kmem_cache_alloc 0 -> kmem_cache_alloc_debug 0 -> verify_and_copy_pattern 0 <- verify_and_copy_pattern 0 -> tsc_gethrtime 0 <- tsc_gethrtime 0 -> getpcstack 0 <- getpcstack 0 -> kmem_log_enter 0 <- kmem_log_enter 0 <- kmem_cache_alloc_debug 0 <- kmem_cache_alloc 0 <- kmem_zalloc 0 <- gld_mac_alloc 0 -> kmem_zalloc 0 -> kmem_alloc 0 -> vmem_alloc 0 -> highbit 0 <- highbit 0 -> lowbit 0 <- lowbit 0 -> vmem_xalloc 0 -> highbit 0 <- highbit 0 -> lowbit 0 <- lowbit 0 -> segkmem_alloc 0 -> segkmem_xalloc 0 -> vmem_alloc 0 -> highbit 0 <- highbit 0 -> lowbit 0 <- lowbit 0 -> vmem_seg_alloc 0 -> highbit 0 <- highbit 0 -> highbit 0 <- highbit 0 -> vmem_seg_create ... |