Manuel de suivi dynamique Solaris

Variables externes

Le langage D utilise le caractère ` comme opérateur d'étendue spécial pour accéder aux variables définies dans le système d'exploitation et non dans votre programme en D. Par exemple, le noyau de Solaris contient une déclaration en C du réglage système kmem_flags pour activer les fonctions de débogage du programme d'allocation de mémoire. Reportez-vous au manuel Solaris Tunable Parameters Reference Manual pour plus d'informations sur kmem_flags. Ce réglage est déclaré sous forme de variable en C dans la source du noyau comme suit :

int kmem_flags;

Pour accéder à la valeur de cette variable dans un programme en D, utilisez la notation en D suivante :

`kmem_flags

DTrace associe chaque symbole de noyau au type utilisé pour le symbole dans le code en C correspondant du système d'exploitation, simplifiant ainsi l'accès basé sur la source aux structures de données du système d'exploitation natif. Pour utiliser les variables externes du système d'exploitation, vous devez accéder au code source correspondant du système d'exploitation.

Lorsque vous accédez à des variables externes à partir d'un programme en D, vous accédez aux détails d'implémentation interne d'un autre programme comme le noyau du système d'exploitation ou ses pilotes de périphérique. Ces détails d'implémentation ne constituent pas une interface stable sur laquelle vous pouvez compter ! Tout programme en D que vous écrivez et qui repose sur ces détails peut être interrompu lors de la prochaine mise à jour de la partie logicielle correspondante. C'est pourquoi, les variables externes sont généralement utilisées par les développeurs de noyaux et de pilotes de périphérique, ainsi que par les techniciens de maintenance, pour déboguer les problèmes de performances ou de fonctionnalités à l'aide de DTrace. Pour plus d'informations sur la stabilité de vos programmes en D, reportez-vous au Chapitre39Stabilité.

Les noms de symbole de noyau sont conservés dans un espace de noms distinct des identificateurs de fonctions et de variables en D de sorte que vous n'ayiez jamais à vous préoccuper des conflits de noms avec vos variables en D. Lorsque vous ajoutez le préfixe ` à une variable, le compilateur D recherche les symboles de noyau connus dans la liste de modules chargés pour trouver une définition de variable correspondante. Comme le noyau de Solaris prend en charge les modules chargés de manière dynamique avec les espaces de noms distincts, le même nom de variable peut être utilisé plusieurs fois dans le noyau actif du système d'exploitation. Vous pouvez résoudre ces conflits de noms en spécifiant le nom du module de noyau dont l'accès à la variable doit être exécuté avant l'accès au symbole ` dans le nom du symbole. Par exemple, chaque module de noyau chargeable fournit généralement une fonction _fini(9E). Pour renvoyer à l'adresse de la fonction _fini fournie par le module de noyau foo, vous devez écrire :

foo`_fini

Vous pouvez appliquer des opérateurs en D aux variables externes, à l'exception de ceux qui modifient des valeurs, en fonction des règles usuelles des types d'opérande. Lorsque vous lancez DTrace, le compilateur en D charge l'ensemble des noms de variable correspondant aux modules de noyau actifs, par conséquent, les déclarations de ces variables ne sont pas requises. Vous ne pouvez pas appliquer d'opérateur modifiant sa valeur à une variable externe, comme = ou +=. À des fins de sécurité, DTrace vous empêche d'endommager ou de corrompre l'état du logiciel que vous observez.