Manuel de suivi dynamique Solaris

Sous-routines

Les sous-routines diffèrent des actions car généralement, elles n'affectent que l'état interne de DTrace. Par conséquent, il n'existe pas de sous-routines destructrices et les sous-routines ne procèdent jamais au suivi de données dans des tampons. De nombreuses sous-routines ont des analogues dans les sections 9F ou 3C. Pour plus d'informations sur les sous-routines correspondantes, reportez-vous aux sections Intro(9F) et Intro(3).

alloca()

void *alloca(size_t size)

alloca() alloue size octets depuis un espace de travail, et renvoie un pointeur vers la mémoire allouée. Le pointeur renvoyé présente systématiquement un alignement de 8 octets. L'espace de travail n'est valide que pendant la durée d'une clause. La mémoire allouée avec alloca()est libérée lors de l'achèvement de la clause. Si l'espace de travail disponible n'est pas suffisant, aucune mémoire n'est allouée et une erreur est générée.

basename()

string basename(char *str)

basename() est un analogue D de basename(1). Cette sous-routine crée une chaîne qui comprend une copie de la chaîne spécifiée, mais sans le préfixe se terminant par /. La chaîne renvoyée est allouée à l'extérieur de la mémoire de travail. Sa durée de validité correspond donc à la durée de la clause. Si l'espace de travail disponible est insuffisant, basename ne s'exécute pas et une erreur est générée.

bcopy()

void bcopy(void *src, void *dest, size_t size)

bcopy() copie size octets de la mémoire src dans la mémoire dest. L'ensemble de la mémoire source doit résider à l'extérieur de la mémoire de travail tandis que l'ensemble de la mémoire de destination doit résider à l'intérieur. Si ces conditions ne sont pas remplies, aucune copie n'est effectuée et une erreur est générée.

cleanpath()

string cleanpath(char *str)

cleanpath() crée une chaîne qui consiste en une copie du chemin str, mais dont certains éléments redondants sont éliminés. En particulier, les éléments “/./” du chemin sont supprimés et les éléments “/../” réduits. La réduction des éléments /../ est effectuée indépendamment des liens symboliques. Il est donc possible que cleanpath() copie un chemin valide et renvoie un chemin plus court, non valide.

Par exemple, si str correspond à “ /foo/../bar” et que /foo est un lien symbolique vers /net/foo/export cleanpath() renvoie la chaîne “/bar” même si bar risque de ne figurer que dans /net/foo et non dans /. Cette limitation est due au fait que cleanpath() est appelé dans le contexte d'un déclenchement de sonde, où la résolution de liens symboliques ou de noms arbitraires est impossible. La chaîne renvoyée est allouée à l'extérieur de la mémoire de travail. Sa durée de validité correspond donc à la durée de la clause. Si l'espace de travail disponible est insuffisant, cleanpath ne s'exécute pas et une erreur est générée.

copyin()

void *copyin(uintptr_t addr, size_t size)

copyin() copie le nombre d'octets spécifié depuis l'adresse de l'utilisateur spécifiée dans un tampon de travail DTrace et renvoie l'adresse de ce tampon. L'adresse de l'utilisateur est interprétée en tant qu'adresse de l'espace du processus associé au thread actuel. Le pointeur de tampon qui en résulte comporte obligatoirement un alignement à 8 octets. L'adresse en question doit correspondre à une page par défaut dans le processus en cours. Si l'adresse ne correspond pas à une page par défaut, ou si l'espace de travail disponible est insuffisant, la valeur NULL est renvoyée et une erreur est générée. Pour connaître les techniques visant à réduire le risque d'apparition d'erreurs copyin, reportez-vous au Chapitre33Suivi des processus utilisateur.

copyinstr()

string copyinstr(uintptr_t addr)

copyinstr() copie une chaîne C terminée par un octet nul à partir de l'adresse de l'utilisateur spécifiée dans un tampon de travail DTrace et renvoie l'adresse de ce tampon. L'adresse de l'utilisateur est interprétée en tant qu'adresse de l'espace du processus associé au thread actuel. La longueur de la chaîne est limitée à la valeur définie par l'option strsize ; pour plus d'informations, consultez le Chapitre16Options et paramètres réglables. Comme pour copyin, l'adresse spécifiée doit correspondre à une page par défaut dans le processus en cours. Si l'adresse ne correspond pas à une page par défaut, ou si l'espace de travail disponible est insuffisant, la valeur NULL est renvoyée et une erreur est générée. Pour connaître les techniques visant à réduire le risque d'apparition d'erreurs Chapitre33Suivi des processus utilisateur, reportez-vous au Chapter 33, User Process Tracing.

copyinto()

void copyinto(uintptr_t addr, size_t size, void *dest)

copyin() copie le nombre d'octets spécifié depuis l'adresse de l'utilisateur spécifiée dans un tampon de travail DTrace spécifié par dest. L'adresse de l'utilisateur est interprétée en tant qu'adresse de l'espace du processus associé au thread actuel. L'adresse en question doit correspondre à une page par défaut dans le processus en cours. Si l'adresse ne correspond pas à une page par défaut ou qu'aucune mémoire de destination ne réside à l'extérieur de l'espace de travail, aucune copie n'est effectuée et une erreur est générée. Pour connaître les techniques visant à réduire le risque d'apparition d'erreurs Chapitre33Suivi des processus utilisateur, reportez-vous au Chapter 33, User Process Tracing.

dirname()

string dirname(char *str)

dirname() est un analogue D de dirname(1). Cette sous-routine crée une chaîne comprenant le nom du chemin complet à l'exception du dernier niveau, str . La chaîne renvoyée est allouée à l'extérieur de la mémoire de travail. Sa durée de validité correspond donc à la durée de la clause. Si l'espace de travail disponible est insuffisant, dirname ne s'exécute pas et une erreur est générée.

msgdsize()

size_t msgdsize(mblk_t *mp)

msgdsize() renvoie le nombre d'octets dans le message de données vers lequel pointe mp. Pour plus d'informations, consultez msgdsize(9F). msgdsize() ne prend en compte dans le total que les blocs de données de type M_DATA.

msgsize()

size_t msgsize(mblk_t *mp)

msgsize() renvoie le nombre d'octets dans le message vers lequel pointe mp. Contrairement à msgdsize(), qui renvoie uniquement le nombre d'octets des données, msgsize() renvoie le nombre total d'octets du message.

mutex_owned()

int mutex_owned(kmutex_t *mutex)

mutex_owned() est une implémentation de mutex_owned(9F). mutex_owned() renvoie une valeur différente de zéro si le thread d'appel est le propriétaire du mutex de noyau, ou une valeur égale à zéro si le mutex adaptatif n'a pas de propriétaire.

mutex_owner()

kthread_t *mutex_owner(kmutex_t *mutex)

mutex_owner() renvoie le pointeur de thread du propriétaire actuel du mutex de noyau adaptatif. mutex_owner() renvoie NULL si le mutex adaptatif spécifié n'a pas de propriétaire ou s'il s'agit d'un spin mutex. Consultez mutex_owned(9F).

mutex_type_adaptive()

int mutex_type_adaptive(kmutex_t *mutex)

mutex_type_adaptive() renvoie une valeur différente de zéro si le mutex de noyau spécifié est de type MUTEX_ADAPTIVE, ou une valeur égale à zéro dans le cas contraire. Les mutex sont adaptatifs s'ils remplissent au moins une des conditions suivantes :

Pour plus d'informations sur les mutex, consultez mutex_init(9F). La majorité des mutex du noyau Solaris sont adaptatifs.

progenyof()

int progenyof(pid_t pid)

progenyof() renvoie une valeur différente de zéro si le processus d'appel (le processus associé au thread qui déclenche actuellement la sonde correspondant aux critères) fait partie du progeny de l'ID de processus spécifié.

rand()

int rand(void)

rand() renvoie un nombre entier pseudo-aléatoire. Le nombre renvoyé est un nombre pseudo-aléatoire faible. Il ne doit pas être utilisé dans le cadre d'une application cryptographique.

rw_iswriter()

int rw_iswriter(krwlock_t *rwlock)

rw_iswriter() renvoie une valeur différente de zéro si le verrou de lecture-écriture est possédé ou requis par un programme d'écriture. Si le verrou est possédé par des programmes de lecture et qu'aucun programme d'écriture n'est bloqué, ou que le verrou n'est pas possédé, rw_iswriter() renvoie une valeur égale à zéro. Consultez rw_init(9F).

rw_write_held()

int rw_write_held(krwlock_t *rwlock)

rw_write_held() renvoie une valeur différente de zéro si le verrouillage en lecture-écriture spécifié est actuellement possédé par un programme d'écriture. Si le verrou est possédé uniquement par des programmes de lecture ou qu'il n'est pas possédé, rw_write_held() renvoie une valeur égale à zéro. Consultez rw_init(9F).

speculation()

int speculation(void)

speculation() réserve un tampon de suivi spéculatif à utiliser avec speculate() et renvoie un identificateur correspondant à ce tampon. Pour plus d'informations, reportez-vous au Chapitre13Suivi spéculatif.

strjoin()

string strjoin(char *str1, char *str2)

strjoin() crée une chaîne composée de l'élément str1 concaténé avec l'élément str2. La chaîne renvoyée est allouée à l'extérieur de la mémoire de travail. Sa durée de validité correspond donc à la durée de la clause. Si l'espace de travail disponible est insuffisant, strjoin ne s'exécute pas et une erreur est générée.

strlen()

size_t strlen(string str)

strlen() renvoie la longueur de la chaîne spécifiée en octets, à l'exception de l'octet nul de fin.