pdbx
Détail des fonctionnalités du débogueur symbolique parallèle pdbx
Lancement de pdbx
Autres fonctionnalités importantes
pdbx est un débogueur symbolique textuel qui étend l'interface et les commandes de dbx aux applications parallèles de type poe.
pdbx travaille de manière optimale sur un code compilé avec l'option -qdbg (synonyme de -g) et sans optimisation (option -qnooptimize recommandée). Cela a pour effet de rajouter des informations de déboguage dans le code objet. Ces informations permettent à pdbx de voir les variables locales et de déterminer les numéros des lignes du source.
Les processeurs des noeuds du cluster sont appelés processor nodes. Un programme parallèle s'exécute comme un ensemble de tâches distinctes mais liées sur un nombre de processor nodes. Ce groupe de tâches parallèles est appelé une partition.
Lancement de pdbx
On peut démarrer pdbx soit en mode normal soit en mode attach.En mode normal le programme s'exécute sous le contrôle du débogueur. En mode attach on lie le débogueur à un programme qui est déjà en cours d'exécution. Certaines options et commandes ne fonctionnent que dans un de ces deux modes. En général, les arguments qui contrôlent la manière dont la partition est construite, transmettent les noms des applications les arguments ne peuvent être employées en mode attach. Avant d'utiliser pdbx pour déboguer un programme, il faut le compiler avec au moins l'option -qdbg. Celle-ci inclut des informations supplémentaires de déboguage dans le fichier objet qui permettent à pdbx de lister les variables locales et de trouver les numéros des lignes de code source.
Si vous utilisez pdbx sur un code qui n'a pas été compilé avec l'option -qdbg, les variables locales sont invisibles pour dbx et les numéros des lignes ne sont pas cohérents en raison d'optimisations diverses. Il est plus difficile de déboguer un code sans références fiables aux lignes de code.
Si l'application est lancée au travers de pdbx en mode normal, celui-ci rend la main à l'utilisateur sur la première instruction exécutable du programme principal.
Mode normal
La manière de lancer pdbx en mode normal dépend de la nature du programme à déboguer, i.e. s'il s'agit d'une application de type SPMD (Single Program Multiple Data) ou MPMD (Multiple Program Multiple Data). Dans le modèle SPMD, le même programme est exécuté sur chaque processeur de la partition. Dans le cas MPMD, différents programmes peuvent s'exécuter sur les processeurs de la partition.Si on débogue un programme de type SPMD, on peut entrer son nom sur la ligne de commande de pdbx. Il est alors chargé automatiquement sur tous les processeurs de la partition. Si on débogue un programme de type MPMD, on doit charger les tâches de la partition après le lancement du débogueur. pdbx recherche dans le répertoire courant à moins qu'un chemin absolu lui soit donné.
La commande de lancement de pdbx en mode normal est la suivante :
pdbx [program [program_options]] [poe_options] [-c command_file] [-d nesting_depth] [-I directory [-I directory] ...] [-F] [-x]
Si on spécifie un programme, il est chargé et on obtient le message suivant :
0031-504 Partition loaded ...
Le prompt de pdbx est alors :
pdbx(all)
Ce prompt indique le contexte de commande all. Pour plus d'information, voir la rubrique Mise en place de contexte de commande.
La commande de lancement de pdbx en mode attach est la suivante :
pdbx -a poe_process_id [limited_poe_options] [-c command_file] [-d nesting_depth] [-I directory [-I directory] ...] [-F] [-x]
Pour plus d'information, voir la rubrique Mode attach.
Pour obtenir la syntaxe de la ligne de commande de pdbx et une description de ses options, on tape :
pdbx -h
Les informations sont envoyées vers l'erreur standard stderr.
Mode attach
Le débogueur pdbx possède la fonctionnalité de pouvoir s'attacher à une application parallèle en cours d'exécution. Cela peut être utile dans le cas de grosses applications qui après un certain temps semblent figées. Pour pouvoir s'attacher, il faut connaitre le process id de la commande poe. On peut l'obtenir avec la commande Unix :ps -ef | grep poe.
De là, on attache pdbx avec la commande :
pdbx -a poe_processis_id
En réponse, pdbx affiche une liste des numéros des tâches qui englobe l'application parallèle. On extrait une sous-liste à attacher au débogueur. L'opération d'ajout / retrait de tâches se fait en une seule fois. En cas d'erreur ou de changement, il faut détacher le déboguer et le ré-attacher ensuite.
Les processus attachés au débogueur sont alors arrêtés, quel que soit l'état de leur compteur et passent sous le contrôle du débogueur. Les autres processus de l'application parallèle (s'il y en a) continuent leur exécution. Les informations de pdbx sur les processus attachés sont données en utilisant le rang des processus au sein de l'application poe.
Exemple :
gm@joe-%ps -ef | grep poe
gm 72158 113052 7 15:52:05 pts/9 0:00 poe
gm 136226 127616 1 15:52:09 pts/8 0:00 grep -n poe
gm@joe-%pdbx -a 72158
pdbx Version 3, Release 2 -- Jun 19 2002 21:40:12
ATTENTION: 0029-9049 The following environment variables have been ignored since they are not valid when starting the debugger in attach mode -
'MP_PROCS, MP_HOSTFILE, MP_EUILIB'.
To begin debugging in attach mode, select a task or tasks to attach.
Task IP Addr Node PID Program 0 195.221.22.10 joe 43644 ./C3Dgc_mpi.out 1 195.221.22.10 joe 141098 ./C3Dgc_mpi.out 2 195.221.22.10 joe 104258 ./C3Dgc_mpi.out 3 195.221.22.10 joe 84236 ./C3Dgc_mpi.out
At the pdbx prompt enter the "attach" command followed by a list of tasks or "all". (ex. "attach 2 4 5-7" or "attach all") You may also type "help" for more information or "quit" to exit the debugger without attaching.
Pour chacune des tâches, pdbx affiche des informations les informations suivantes : rang du processus, numéro IP du noeud d'exécution, nom du noeud d'exécution, process id du processus, nom et éventuelles options du processus.
De plus, il indique les variables d'environnement de poe qui ne sont pas prises en compte.
Après l'initiation de l'attachement, on sélectionne l'ensemble des processus que l'on va attacher réellement à pdbx. On entre au prompt :
attach all
ou
attach tasks_list (voir la rubrique Syntaxe d'une liste de tâches pour la syntaxe correcte).
Les seules autres commandes qui peuvent être employées sont help et quit. A ce niveau, la seconde ne va pas détruire l'application en cours d'exécution puisque pdbx n'est pas encore attachée à elle.
pdbx peut fournir des informations utiles lorsqu'il traite une application compilée avec l'option -g. Dans le cas contraire, les informations possibles se limiteront à la pile d'appels.
Si l'application transmise à pdbx est compilée avec l'option -g et des options d'optimisation, cela peut provoquer des imprécisions sur les numéros des lignes dûes aux transformations des lignes de code.
Les options de pdbx qui contrôlent la manière dont la partition est construite, transmettent les noms des applications et leurs arguments ne peuvent être employées en mode attach. Cela provoque l'affichage d'un message signifiant que pdbx ne peut démarrer.
Options de la ligne de commande
Les options de la ligne de commande de pdbx sont :- -a :
elle permet de s'attacher à un programmme poe en cours d'exécution . Exemple :
pdbx -a poe_process_id - -c :
elle lit les commandes de démarrage du fichier command_file donné en argument. Les commandes qu'il contient sont exécutées avant les commandes données à partir du clavier.
Si cette option est omise, pdbx cherche le fichier .pdbxinit dans le répertoire courant puis dans le home directory de l'utilisateur. On peut aussi lire des commandes à exécuter en utilisant la commande source. Pour plus d'information, voir la rubrique Lire des commandes à partir d'un fichier. Exemple :
pdbx -c start.cmd - -d :
elle détermine le niveau maximal d'imbrication dans le programme. Le niveau par défaut est 25. Cette valeur est transmise, non modifiée à dbx. Exemple :
pdbx -d nesting_depth -
- -F :
elle permet de désactiver la lecture complète de la table des symboles d'un programme. Seuls les symboles nécessaires sont lus ; ainsi les symboles des fonctions définies dans d'autres fichiers ne deviennent accessibles que lorsque ces fichiers sont référencés. Cela peut être intéressant dans le cas de très gros programmes. Exemple :
pdbx -F - -h :
elle affiche la syntaxe de la ligne de commande de pdbx et une description de ses options ; ces informations sont envoyées vers l'erreur standard stderr. Exemple :
pdbx -h - -I :
elle permet de spécifier un répertoire pour la recherche de fichiers source d'un exécutable. Cette option peut être employée plusieurs fois. Exemple :
pdbx -Idir1 -Idir2 - -x :
elle permet à pdbx de distinguer les symboles qui sont identiques à l'exception d'un caractère '_' final.
Après initialisation, pdbx affiche son prompt pour indiquer qu'il est prêt pour la suite.
Chargement de la partition avec la commande load
Avant de pouvoir déboguer un programme, il est nécessaire de charger une partition, i.e. un ensemble de processus parmi les tâches de l'application parallèle. Si on spécifie un nom de programme avec la commande pdbx alors le chargement a lieu automatiquement. Si ce n'est pas le cas, on utilise la commande load pour le faire. Par défaut, pdbx va regarder dans le répertoire courant. Le nombre de processus crées est donné par la variable d'environnement MP_PROCS ou par l'option -procs de poe. Selon le nombre d'exécutable à charger, la procédure n'est pas la même :- charger le même exécutable sur tous les processus de la partition :
dans ce cas, le prompt de pdbx apparait avec le contexte all :
pdbx(all)
Si ce n'est pas le cas, on l'impose à toutes les tâches avec la commande :
on allUne fois le contexte déterminé sur tous les processus, on charge le programme avec la commande :
load program [program_options]
Le message Partition loaded ... s'affiche alors et pdbx rend la main à l'utilisateur sur la première instruction exécutable du programme principal. - charger plusieurs exécutables sur les processus de la partition :
il faut préparer le contexte pour chaque ensemble de processus. Prenons l'exemple de 5 tâches (rang 0 à 4). On charge le programme program1 sur le processus de rang 0 et le programme program2 sur les processus de rang 1 à 4. Cela donne la commande suivante pour placer le contexte sur le processus de rang 0 :
on 0
On charge alors le programme program1 sur ce processus :
load program1 [program1_options]On crée un groupe avec les processus de rang 1 à 4 :
group add groupa 1-4
pdbx place le contexte sur ce groupe :
on groupaOn charge le programme program2 sur les 4 processus :
load program2 [program2_options]
Le message Partition loaded ... s'affiche alors.
Affichage des tâches et de leur état
Avec la commande tasks on affiche des informations relatives à toutes les tâches dans la partition. Si on ajoute la clause long, on obtient aussi le nom, le numéro IP de la machine d'exécution
| pdbx(attached) tasks | |||
| 0:D | 1:D | 2:D | 3:D |
| pdbx(attached) tasks long | |||
| 0:Debug ready | joe | 195.221.22.10 | -1 |
| 1:Debug ready | joe | 195.221.22.10 | -1 |
| 2:Debug ready | joe | 195.221.22.10 | -1 |
| 3:Debug ready | joe | 195.221.22.10 | -1 |
Voir ce tableau (rubrique Liste des tâches des groupes) pour la signification des codes d'état.
Groupage des tâches
On peut affecter un contexte à un groupe de tâches avec la commande group qui permet de regrouper plusieurs tâches sous un même nom. Ensuite, avec la commande on on affecte un contexte à un groupe en donnant son nom.Syntaxe d'un nom de groupe
Le nom fait au maximum 32 caractèeres et commence obligatoirement par une lettre. Elle peut être suivie de n'importe quel caractère alphanumérique. Les noms all, none, attached sont des noms de groupe réservés.Syntaxe d'une liste de tâches
Pour indiquer un ensemble consécutif de tâches, on donne les rangs de la première et de la dernière tâche séparés par un tiret ou un double-point. Pour indiquer des tâches individuelles, on donne la liste des rangs séparés par des virgules ou des caractères espaces.Ajout d'une tâche dans un groupe
Pour ajouter un processus à un groupe existant ou nouveau, on utilise l'action add de la commande group :group add group_name task_list
Si le groupe spécifié existe déjà, le débogueur ajoute ces tâches à la liste du groupe. Si le groupe n'existe pas, le débogueur le crée.
| si la variable task_list est | à ajouter au groupe groupa : | on entre la commande : | le message suivant s'affiche : |
| une seule tâche | la tâche 6 | group add groupa 6 | 1 task was added to group "groupa" |
| plusieurs tâches | les tâches 6, 8 et 10 | group add groupa 6,8,10 | 3 tasks were added to group "groupa" |
| plusieurs tâches consécutives | les tâches 6 à 10 | group add groupa 6-10 | 5 tasks were added to group "groupa" |
| plusieurs tâches consécutives | les tâches 6 à 10 | group add groupa 6:10 | 5 tasks were added to group "groupa" |
Retrait de tâches dans un groupe
Pour retirer des processus à un groupe, on utilise l'action delete de la commande group :group delete group_name [task_list]
| si la variable task_list est | à ajouter au groupe groupa : | on entre la commande : | le message suivant s'affiche : |
| une seule tâche | la tâche 6 | group delete groupa 6 | task: 6 was successfully deleted from group "groupa" |
| plusieurs tâches | les tâches 6, 8 et 10 | group delete groupa 6,8,10 | task: 6 was successfully deleted from group "groupa" task: 8 was successfully deleted from group "groupa" task: 10 was successfully deleted from group "groupa" |
| plusieurs tâches consécutives | les tâches 6 à 10 | group delete groupa 6-10 | task: 6 was successfully deleted from group "groupa" task: 7 was successfully deleted from group "groupa" task: 8 was successfully deleted from group "groupa" task: 9 was successfully deleted from group "groupa" task: 10 was successfully deleted from group "groupa" |
| plusieurs tâches consécutives | les tâches 6 à 10 | group delete groupa 6:10 | task: 6 was successfully deleted from group "groupa" task: 7 was successfully deleted from group "groupa" task: 8 was successfully deleted from group "groupa" task: 9 was successfully deleted from group "groupa" task: 10 was successfully deleted from group "groupa" |
On peut aussi utiliser l'action delete de la commande group pour éliminer un groupe de tâches complet. Le groupe prédéfini all ne peut pas être détruit.
Changer le nom d'un groupe
Pour changer le nom d'un groupe, on utilise l'action change de la commande group de la manière suivante :group change old_group_name new_group_name
On reçoit le message suivant :
Le prompt du débogueur indique toujours le contexte courant qui est au début :
On utilise donc la commande on pour placer le contexte courant sur une tâche ou un groupe de tâches :
Pour changer temporairement le contexte, on utilise la commande on sur la même ligne que la commande sensible au contexte :
Exemple :
La syntaxe on context_name pdbx_command ne peut pas s'appliquer à des processus en cours d'exécution.
proposant un ensemble restreint de commandes :
Lorsqu'un semi-prompt est rencontré, toutes les entrées sont prises et interprées par pdbx. La plupart des commandes dans ce semi-prompt produisent l'affichage d'informations, à l'exception de halt, back, on et quit. Les commandes halt, back, on entrainent l'affichage du prompt de pdbx lorsque toutes les tâches du contexte courant sont dans l'état debug ready.
stop at <numéro de ligne source> [ if < condition > ]
stop in <procedure> [ if < condition > ]
stop <variable> [ if < condition > ]
stop <variable> at <numéro de ligne source> [ if < condition > ]
stop <variable> at <procedure> [ if < condition > ]
stop at <numéro de ligne source> provoque l'arrêt à chaque passage sur la ligne de code source.
trace <numéro de ligne source> [if < condition >]
trace <procedure> [in <procedure>] [if < condition >]
trace <variable> [in <procedure>] [if < condition >]
trace <expression> at <numéro de ligne source> [if < condition >]
La commande trace sans argument provoque l'affichage des informations pour chaque ligne du code source.
Ainsi pour obtenir la variable globale i ou la variable locale i de la routine myfunc il faut fournir le nom complet, soit respectivement @myfile.i ou @myfile.func.i
Dans le cas de la commande stop, cela donne :
Dans ce cas le débogueur renvoie le message suivant :
La syntaxe de cette commande, qui dépend du contexte, est :
Dans le cas d'un programme reposant sur le principe maître/esclaves contenant des envois/réceptions bloquants, si seule la tâche maîtresse nous intéresse, on peut alors décrocher le débogueur des tâches esclaves afin d'éviter de passer sans arrêt du contexte du maître à celui des esclaves. Pour cela on crée deux groupes de tâches, l'un avec le maître (master) l'autre avec les esclaves (slaves).
Les esclaves sont indirectement affectés par le débogueur puisqu'ils doivent attendre les messages du maître à leurs réceptions bloquantes.
La syntaxe de cette commande, qui dépend du contexte, est :
print procedure ([paramètres])
Voir la section Spécifier des expressions pour obtenir une description des syntaxes valides.
Par exemple, pour afficher une portion d'un tableau bi-dimensionnel ff, on peut employer :
print ff[2..3][4..7]
ou encore
print ff(2..3,4..7)
- en spécifiant une procédure avec l'argument procedure. Dans ce cas, pdbx affiche le source quelques lignes avant le début de la procédure et jusqu'à ce que la fenêtre d'affichage soit remplie.
- en spécifiant des numéros de ligne de début et de fin avec l'attribut sourceline-expression.
L'attribut sourceline-expression consiste en un numéro valide de ligne qui peut être suivi du signe plus (+) ou du signe moins (-) avec un entier. Le caractère dollar ($) indique la ligne courante alors que le caractère @ indique la ligne de source suivante.
Si seule la première ligne à afficher est fournie alors 10 lignes sont affichées en commençant par celle donnée par l'attribut sourceline-expression.
La syntaxe de cette commande, dépendante du contexte, est :
list [procedure | sourceline-expression[, sourceligne-expression]]
La syntaxe de cette commande, indédendante du contexte, est :
help [argument]
La syntaxe de cette commande, indépendante du contexte, est :
dhelp [argument]
alias [nom_alias [expression_remplacée] ]
Le principe d'utilisation est le même que pour pour les aliases des shells.
Il existe un certain nombre d'aliases prédéfinis que l'on peut obtenir en tapant la commande alias sans argument au prompt de pdbx.
Pour détruire un alias existant, on utilise la commande unalias :
unalias nom_alias
source [nom_fichier]
Ce fichier peut contenir toute commande pdbx valide, comme par exemple :
pour mettre en place un environnement plus convivial.
On peut aussi provoquer la lecture d'un fichier de commande lors du lancement de pdbx avec l'option -c. Par contre l'entrée standard ne peut pas être incluse dans un fichier.
+, -, *, / ((division flottante), div (division entière), mod (modulo), exp (exponentielle).
Les opérateurs relationnels ou logiques suivants sont valides :
<, >, <=, >=, ==, = (égalité), !=, <> (non égalité), ||, or (OU logique), &&, AND (ET logique).
La commande quit retourne au prompt du shell courant.
Liste des tâches des groupes
Pour afficher la liste des groupes de tâches, l'état des tâches, on utilise l'action list de la commande group. Sa syntaxe est :
group list [group_name]
si on donne le nom d'un groupe, les informations fournies se limitent aux tâches de ce groupe. Le tableau suivant donne la signification de la lettre qui traduit l'état des tâches.
La lettre à la fin :
représente :
et indique que :
N
Not loaded
la tâche n'a pas encore été chargée avec un exécutable
S
Starting
La tâche est en train d'être chargée avec un exécutable
D
Debug ready
La tâche est arrêtée et prête pour le déboguage
R
Running
La tâche est sous contrôle et exécute le programme
X
Exited
La tâche a fini l'exécution du programme
U
Unhooked
La tâche exécute le programme hors du contrôle du débogueur
E
Error
La tâche est dans un état inconnu
Mise en place de contexte de commande
On peut placer un contexte de commande sur une tâche ou un groupe de tâches de telle sorte que les commandes suivantes, sensibles au contexte, s'appliquent directement à elle(s).
pdbx(all)
on {group_name | task_id }
on {group_name | task_id } [subcommand ]
pdbx(groupa) on 3
pdbx(groupa) on 3 stop at 99
pdbx(3) stop at 99
pdbx(groupa)
pdbx(3) on groupa
pdbx(groupa)
Ainsi la commande stop s'applique directement sur la tâche de rang 3 sans toucher au contexte de commande.
Changement de contexte en cas de blocage
Lorsqu'une tâche est bloquée (le prompt de pdbx est absent), on peut faire un ctrl-c pour reprendre la main. Cela entraine l'affichage d'un semi-prompt,
pdbx-subset([group | task])
- changement du contexte courant,
- affichage d'informations relatives aux groupes / tâches,
- interruption de l'application,
- affichage de l'état des points d'arrêt / point de traçage,
- demande d'aide,
- sortie du débogueur.
Commande :
utilisation :
pour plus d'informations, voir la rubrique :
alias [alias_name]
construit ou affiche des aliases
Création, destruction et affichage d'aliases de commandes
back
retourne au prompt de pdbx
Retour au prompt de pdbx
group < action > [group_name][task_list]
manipule les groupes. Les actions sont add, change, delete etlist
Groupage des tâches
halt [all]
interrompt toutes les tâches en cours d'exécution dans le contexte courant, et toutes les tâches quel que soit leur état avec le groupe all. Retourne au prompt normal
Interruption de tâches
help [subject]
affiche une liste de commandes pdbx ou une aide à leur sujet
Accès à l'aide pour les commandes de pdbx
on <{group | task}>
détermine le contexte courant pour les commandes suivantes. Retourne toujours au prompt normal
Mise en place de contexte de commande
source < cmd_file >
exécute les commandes du fichier en argument
Lire des commandes à partir d'un fichier
status [all]
affiche les évènements de trace et d'arrêt dans le contexte courant ou tous si all est spécifié
Vérification du statut d'évènements
tasks [long]
affiche les processus et leur état
Affichage des tâches et de leur état
quit
quitte pdbx et tue l'application
Quitter pdbx
< ctrl-c >
affiche simplement le message suivant :
Typing ctrl-c from the pdbx subset prompt has no effect.
Use the halt command to interrupt the application.
Use the quit command to quit pdbx.
Type help then enter to view brief help of the commands availableChangement de contexte en cas de blocage
Retour au prompt de pdbx
La commande back provoque l'affichage du prompt de pdbx lorsque toutes les tâches sont dans l'état debug ready. On peut utiliser la commande back pour poursuivre l'exécution de l'application comme elle était juste avant l'interruption par le < ctrl-c >. Cette commande n'est valable que dans le cas d'un semi-prompt.
On peut aussi revenir au prompt de pdbx avec les commandes on et halt.
Contrôle de l'exécution du programme
Comme dbx, pdbx permet de mettre en place des points d'arrêt et des points de trace. Les points d'arrêt, ou breakpoints, provoquent l'arrêt du programme et permettent l'examen de son état.
Les points de trace, ou tracepoints, sont des endroits dans le programme qui, lorsqu'ils sont rencontrées, provoquent l'affichage par le débogueur d'informations concernant l'état du programme. La rencontre d'un point d'arrêt ou d'un point de trace s'appelle un évènement, event.
Ces events fonctionnent un peu différemment de ceux de dbx dans le sens où ils peuvent s'appliquer à un nombre quelconque de tâches parallèles.
Mise en place de points d'arrêt
La commande stop met en place des points d'arrêt pour l'ensemble des tâches dans le contexte courant. Lorsque l'ensemble de ces tâches atteint un de ces points, l'exécution du programme s'arrête et on peut alors examiner l'état du programme à l'aide de commandes dbxpdbx. Ces points d'arrêt peuvent être différents selon les tâches. La syntaxe de cette commande, qui dépend du contexte, est :
stop if <condition>
stop in <procedure> provoque l'arrêt à chaque fois que le programme atteint la première instruction exécutable de la procedure (function, subroutine).
Utiliser <variable> provoque l'arrêt du programme lorsque le contenu de la variable change. Ce type d'arrêt est très consommateur, il peut alors être intéressant de compléter ces points d'arrêt avec un argument supplémentaire comme <numéro de ligne source> ou <procedure>.
L'argument < condition > utilise la syntaxe décrite dans la section Spécifier des expressions.
Interruption de tâches
Avec la commande halt on interrompt toutes les tâches du contexte courant. Cela donne le contrôle au débogueur quelque soit l'endroit du code où se trouvent les applications running. C'est analogue au ctrl-c de dbx. Cette commande fonctionne au prompt pdbx ou à un semi-prompt.
En ajoutant "all", l'ensemble des tâches running, quel que soit leur contexte, sont interrompues.
A un prompt pdbx, la commande halt n'a d'effet que si l'attribut "all" est présent, en effet la présence du prompt indique qu'aucune tâche du contexte courant n'est en cours d'exécution.
Mise en place de points de trace
La commande trace met en place des points de trace pour l'ensemble des tâches dans le contexte courant. Lorsque l'une des tâches atteint un de ces points, cela fait afficher par le débogueur des informations sur l'état du programme.
La syntaxe de cette commande, qui dépend du contexte, est :
trace [<procedure>] [if < condition >]
trace <numéro de ligne source> provoque l'affichage à chaque passage sur la ligne de code source.
trace [in <procedure>] provoque l'affichage à chaque fois que le programme atteint la première instruction exécutable de la procedure (function, subroutine).
Utiliser <variable> provoque l'affichage lorsque le contenu de la variable change. Ce type de point de trace est très consommateur, il peut alors être intéressant de compléter ces points avec un argument supplémentaire comme <numéro de ligne source> ou <procedure>.
L'argument < condition > utilise la syntaxe décrite dans la section Spécifier des expressions.
Spécifier des variables aux commandes stop et trace
Pour spécifier une variable à l'une de ces commandes, il faut fournir le nom complet pour éviter de prendre une variable de même nom dans un autre fichier source (selon la position des tâches au moment de la désignation).
Pour obtenir le nom complet d'une variable, on utilise la commande which et pdbx renvoie l'information suivante :
which i
0:@myfile.i
1:@myfile.myfunc.i
stop if (@myfile.myfunc.i == 5)
all:[0] stop if (@myfile.myfunc.i == 5)
Détruire des évènements
La commande delete permet de retirer des évènements (points d'arrêt et points de trace) de la liste des évènements. Pour indiquer un grand nombre d'évènements, on peut fournir le premier et le dernier numéro d'évènement séparés par un double-point (:) ou un tiret (-). Pour indiquer des évènements isolés on fournit la liste des numéros séparés par des virgules ou des caractères espaces. Le caractère "*" permet de détruire tous les évenements du contexte courant alors que all permet d'éliminer l'ensemble des évènements quel que soit leur contexte.
delete[liste_évènements | * | all ]
Vérification du statut d'évènements
La commande status permet d'obtenir la liste des évènements pdbx. L'attribut all fournit la liste pour tous les groupes et toutes les tâches. On peut l'employer au prompt ou au semi-prompt de pdbx. Comme cette commande dépend du contexte, sans l'attribut all elle n'affiche pas le statut des évèments hors du contexte courant.
Unhooking et hooking de tâches
La commande unhook permet de se décrocher d'une tâche afin qu'elle s'exécute hors intervention du débogueur. Cette commande dépend du contexte et est similaire à la commande detach de dbx. Il existe une différente capitule avec cette dernière qui est que l'on peut ensuite se raccrocher (hook) à une tâche décrochée alors que l'on ne peut pas se rattacher à une tâche dont on s'est détaché. Pour se raccrocher, on employe la commande hook. La commande detach n'est pas supportée par pdbx.
Comme la commande unhook dépend du contexte, on doit d'abord spécifier le contexte (avec la commande on) avant de l'employer :
on slaves
unhook
Si par la suite, on souhaite reprendre le contrôle des tâches du groupe des esclaves, on place le contexte sur leur groupe et on employe la commande hook.
La commande hook est en fait une interruption ; dans le cas d'une réception bloquante interrompue de cette manière, on provoque l'échec de la requête, si le programme ne gère pas les réceptions interrompues, des pertes de données peuvent survenir.
Examen de données du programme
Les sections suivantes décrivent les commandes where, print et list.
Afficher la pile d'appels
La commande where affiche la pile des appels des sous-programmes. Elle dépend du contexte.
Afficher les variables du programme
La commande print permet soit :
- d'afficher la valeur d'une liste d'expressions, spécifiées avec les paramètres expression ;
- d'exécuter une procédure, spécifiée par le paramètre procedure et d'afficher la valeur renvoyée par cette procédure. Les paramètres inclus sont transmis à la procédure.
print expression
Afficher le code source
La commande list permet d'afficher un certain nombre de lignes du fichier source. Le nombre de lignes affichées peut être décrit de deux manières :
Autres fonctionnalités importantes
Accès à l'aide pour les commandes de pdbx
La commande help sans argument affiche une liste de commandes de pdbx et de sujets sur lesquels on peut obtenir des informations.
La commande help avec une commande ou un sujet comme argument affiche l'information relative.
Accès à l'aide pour les commandes de pdbx
La commande dhelp sans argument affiche une liste des commandes de dbx et de sujets sur lesquels on peut obtenir des informations.
La commande dhelp avec une commande ou un sujet comme argument affiche l'information relative.
Création, destruction et affichage d'alises de commandes
La commande alias permet de construire des alias de commande sous forme d'abbréviations. La syntaxe de cette commande, indépendante du contexte, est :
Lire des commandes à partir d'un fichier
La commande source permet de lire une séquence de commandes d'un fichier spécifique. La syntaxe de cette commande, indédendante du contexte, est :
source mes_alias
Spécifier des expressions
L'utilisation d'expressions au prompt de pdbx est très courante. On peut spécifier des conditions en respectant la syntaxe du C avec quelques extensions du Fortran. Les opérateurs arithmétiques suivants sont valides :
Quitter pdbx
On peut quitter à tout moment la session de déboguage soit avec la commande quit soit avec la commande detach.
En mode attach, i.e. s'attacher à une application en cours d'exécution, la sortie peut se faire soit avec la commande quit soit avec la commande detach. Avec la commande quit, on sort du débogueur et les processus s'arrêtent. Avec la commande detach, on sort du débogueur mais les processus continuent leur exécution.