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