Manuel de suivi dynamique Solaris

Chapitre 36 Suivi anonyme

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.

Activations anonymes

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.

Demande d'état anonyme

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.

Exemples de suivi anonyme

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