Manuel de suivi dynamique Solaris

Chapitre 30 Fournisseur pid

Le fournisseur pid permet de suivre l'entrée et le retour d'une fonction d'un processus utilisateur, ainsi que de toute instruction telle que spécifiée par une adresse absolue ou un décalage de fonction. Le fournisseur pid n'entraîne aucun effet de sonde lorsqu'aucune sonde n'est activée. Lorsque des sondes sont activées, elles n'entraînent d'effet que sur les processus suivis.


Remarque –

Lorsque le compilateur intègre une fonction, la sonde pid du fournisseur ne se déclenche pas. Pour éviter l'intégration d'une fonction lors de la compilation, consultez la documentation de votre compilateur.



Remarque –

Le fournisseur pid agit de façon imprévisible lorsqu'il sonde une fonction utilisant des pointeurs de fonction pour appeler une sous-fonction. Pour analyser cette fonction, vous pouvez placer des sondes de façon explicite à l'adresse de l'entrée et du retour de la fonction.


Attribution d'un nom à des sondes pid

Le fournisseur pid définit en réalité une classe de fournisseurs. Chaque processus peut éventuellement disposer d'un fournisseur pid associé propre. Un processus avec l'ID 123, par exemple, pourrait être suivi à l'aide du fournisseur pid123. Pour les sondes de l'un de ces fournisseurs, la partie du module de la description de la sonde fait référence à un objet chargé dans l'espace d'adresse du processus correspondant. L'exemple suivant utilise mdb(1) pour afficher une liste d'objets :


$ mdb -p 1234
Loading modules: [ ld.so.1 libc.so.1 ]
> ::objects
    BASE    LIMIT     SIZE NAME
   10000    34000    24000 /usr/bin/csh
ff3c0000 ff3e8000    28000 /lib/ld.so.1
ff350000 ff37a000    2a000 /lib/libcurses.so.1
ff200000 ff2be000    be000 /lib/libc.so.1
ff3a0000 ff3a2000     2000 /lib/libdl.so.1
ff320000 ff324000     4000 /platform/sun4u/lib/libc_psr.so.1

Dans la description de la sonde, attribuez à l'objet le nom du fichier, et non son chemin d'accès complet. Vous pouvez également omettre le suffixe .1 ou so.1. Tous les exemples suivants nomment la même sonde :

pid123:libc.so.1:strcpy:entry
pid123:libc.so:strcpy:entry
pid123:libc:strcpy:entry

Le premier exemple illustre le nom réel de la sonde. Les autres exemples sont des alias pratiques remplacés par le nom complet de l'objet de charge en interne.

Pour l'objet de charge de l'exécutable, vous pouvez utiliser l'alias a.out . Les deux descriptions de sonde suivantes nomment la même sonde :

pid123:csh:main:return
pid123:a.out:main:return

Comme pour toutes les sondes DTrace ancrées, le champ de fonction de la description de la sonde nomme une fonction du champ de module. Un binaire d'application utilisateur peut comporter plusieurs noms pour la même fonction. Par exemple, mutex_lock peut être un autre nom de la fonction pthread_mutex_lock dans libc.so.1 . DTrace choisit un nom canonique pour de telles fonctions et utilise ce nom en interne. L'exemple suivant illustre comment DTrace remappe en interne les noms de module et de fonction sous forme canonique :


# dtrace -q -n pid101267:libc:mutex_lock:entry'{ \
    printf("%s:%s:%s:%s\n", probeprov, probemod, probefunc, probename); }'
pid101267:libc.so.1:pthread_mutex_lock:entry
^C

Ce renommage automatique signifie que les noms des sondes que vous activez peuvent être légèrement différents de celles réellement activées. Le nom canonique est toujours cohérent entre des exécutions de DTrace sur des systèmes utilisant la même version de Solaris.

Pour obtenir des exemples d'utilisation effective du fournisseur pid, reportez-vous au Chapitre33Suivi des processus utilisateur.

Sondes de limite de fonction

Le fournisseur pid vous permet de suivre une entrée et un retour de fonction dans des programmes utilisateur tout comme le fournisseur FBT qui propose cette fonctionnalité pour le noyau. La plupart des exemples dans ce manuel qui utilisent le fournisseur FBT pour suivre des appels de fonction du noyau peuvent être légèrement modifiés pour être appliqués à des processus utilisateur.

Sondes entry

Une sonde entry se déclenche lorsque la fonction suivie est invoquée. Les arguments des sondes d'entrée sont les valeurs des arguments de la fonction suivie.

Sondes return

Une sonde return se déclenche lorsque la fonction suivie est renvoyée ou appelle une autre fonction. La valeur de arg0 est le décalage dans la fonction de l'instruction de retour ; arg1 contient la valeur de retour.


Remarque –

L'utilisation de argN renvoie les valeurs brutes non filtrées, comme int64_t. Le fournisseur pid ne prend pas en charge le format args[N].


Sondes de décalage de fonction

Le fournisseur pid vous permet de suivre toute instruction d'une fonction. Par exemple, pour suivre l'instruction 4 octets dans une fonction main(), vous pourriez utiliser une commande similaire à l'exemple suivant :

pid123:a.out:main:4

Cette sonde est activée chaque fois que le programme exécute l'instruction à l'adresse main+4. Les arguments de sondes de décalage ne sont pas définis. L'ensemble uregs[] vous permet de connaître l'état du processus au niveau de ces sites de sonde. Pour plus d'informations, reportez-vous à la section Tableau uregs[].

Stabilité

Le fournisseur pid utilise un mécanisme de stabilité DTrace pour décrire ses stabilités, tel qu'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 

En cours d'évolution 

En cours d'évolution 

ISA

Module 

Privé 

Privé 

Inconnu 

Fonction 

Privé 

Privé 

Inconnu 

Nom 

En cours d'évolution 

En cours d'évolution 

ISA

Arguments 

Privé 

Privé 

Inconnue