Babel : options de débogage du compilateur Fortran

Dans une phase de débogage, les options suivantes peuvent être d'une aide précieuse  :

  • -g (option activée par défaut à l'IDRIS) génère une table des symboles (numéro de ligne, variables, …) qui pourra être exploitée par un débogueur par la suite. Elle permet aussi de générer les numéros d'instructions dans les tracebacks. Cette option conserve le niveau d'optimisation demandé.
  • -qfullpath inscrit les chemins d'accès aux fichiers source et d'include dans les fichiers objets (doit être combinée avec -g). Elle permet au débogueur de trouver automatiquement les fichiers source.
  • -qnooptimize permet d'inhiber toute optimisation.
  • -qoptdebug permet de conserver le niveau d'optimisation. Pour chaque fichier source, un fichier (ayant l'extension .optdbg) est généré. Il contient un pseudocode optimisé pouvant être lu par un débogueur.
  • -qdebug=diagnostic affiche des informations sur l'utilisation de la double FPU.
  • -qinitauto=7FBFFFFF initialise au préalable toutes les variables temporaires à NaNs (ou à zéro si -qinitauto seul).
  • -C génère un signal SIGTRAP lorsqu'un tableau est adressé en dehors de ses bornes (bound checking). Pour intercepter ce signal l'option -qsigtrap décrite ci-dessous est nécessaire.
  • -qfloat=nans permet de détecter l'apparition de valeurs invalides NaN lors des conversions de double précision en simple précision.
  • -qflttrap=overflow:underflow:zerodivide:invalid:enable -qarch=450 permet de détecter les exceptions (overflow, underflow, division par zéro, opération invalide). Il faut obligatoirement spécifier -qarch=450 (avec l'architecture 450D, la double unité arithmétique flottante ne génère pas d'exceptions) et -qsigtrap pour intercepter les exceptions.
  • -qsigtrap intercepte le signal SIGTRAP émis suite à une exception ou à un débordement de tableau et interrompt l'exécution avec impression d'une traceback (voir aussi l'option -g).
  • -qsave force le mode d'exécution statique. Sur Babel, par défaut, nous sommes en mode stack (recommandé mais révélateur d'erreurs de programmation cachées par le mode statique !) ; les variables locales sont alors stockées temporairement dans la zone mémoire dite stack. Si cette option provoque un retour à la normale, il faut sûrement incriminer des variables locales non initialisées ou non sauvegardées à tort (cf. attribut SAVE), comme les compteurs incrémentés à chaque appel de procédure.
  • -qkeepparm pour obliger le compilateur à conserver dans le stack les valeurs des arguments d'appel (certaines optimisations peuvent changer cela). Celles-ci seront ainsi récupérables dans n'importe quel débogueur.

Il existe aussi une option -qlanglvl pour vérifier la conformité du source à une norme Fortran. Par exemple -qlanglvl=95std pour la norme Fortran 95.

Exemple de gestion de débordement de tableaux :

Babel : mpixlf90_r -g -C -qsigtrap debordement.f90
Babel : bgrun -np 64 -exe /path_to_exec/a.out

  Signal received: SIGTRAP - Trace trap
    Fortran language trap: subscript out of bounds

  Traceback:
    Offset 0x00000090 in procedure debord, near line 6 in file debordement.f90
    --- End of call chain ---

Exemple utilisant toutes les options décrites :

Babel : mpixlf90_r -g -qsigtrap -qoptdebug -qfullpath -C -qinitauto=7FBFFFFF 
      -qflttrap=overflow:underflow:zerodivide:invalid:enable -qarch=450 
      -qfloat=nans -qsigtrap -qkeepparm -qlanglvl=90std test.f90