11
votes

Variables de module Fortran non accessibles dans les débuggeurs

J'ai compilé un code FORTRAN, qui contient plusieurs modules, en utilisant à la fois GFORTRAN 4.4 et Intel 11.1 et a ensuite essayé de le déboguer à la fois de GDB et de DDT. Dans tous les cas, je ne peux pas voir les valeurs des variables déclarées dans des modules. Ces variables globales ont des valeurs, car le code fonctionne toujours correctement, mais je ne peux pas voir quelles sont les valeurs dans mes debuggers. Les variables locales vont bien. J'ai eu du mal à trouver une solution à ce problème ailleurs en ligne, il n'ya donc pas de solution simple, mais il sera vraiment difficile de déboguer mon code si je ne vois pas les valeurs d'aucune de mes variables globales.


4 commentaires

Est-ce que vous compilez avec des drapeaux -O0 et -g?


J'ai vu cela et ce que j'ai fait était de joindre les variables dans un type d'utilisateur et de conserver un enregistrement global (sauvegardé). Ensuite, vous accédez au débogueur avec% (exemple ot% point_count lorsque OT contient mes gobilles)


Aux atomes de pseudonymes, la compilation de -O0 a fait l'affaire, mais pour des éléments non-arrayés uniquement. Je lis cette optimisation peut entraîner des variables globales ne pas être accessibles, mais je pensais que si aucun drapeau d'optimisation n'était utilisé, le compilateur n'a pas d'optimisation par défaut. Apparemment, j'avais tort. Cependant, je ne peux toujours pas accéder à aucune information de mes matrices globales. Encore une fois, ils sont lus dans et attribué des valeurs correctement, mais je ne peux pas imprimer l'ensemble de la matrice ou des éléments individuels du tableau dans le débogueur.


J'ai posé une question similaire et j'ai ensuite pu répondre moi-même. Principalement, il implique de jeter les pointeurs à différents types, alors vous pouvez les visualiser à ce que vous souhaitiez (comme des tableaux, des structures, etc.) Stackoverflow.com/questions/46141549/...


3 Réponses :


3
votes

Dans GDB, essayez de référencer les variables globales avec des noms tels que __ modulename __ variablename

Vous pouvez vérifier qu'il s'agit du bon schéma de mangling utilisant NM et GREP pour trouver l'une de vos variables globales dans les symboles de votre programme.

Si cela ne fonctionne pas, assurez-vous d'utiliser une version récente de GDB.

Voici un fil sur ce numéro: http: //gcc.gnu .org / ml / fortran / 2005-04 / msg00064.html


2 commentaires

Cela fonctionne pour afficher des éléments non-réseau en plus de compiler -O0. Je peux imprimer des variables globales, mais je ne vois toujours pas les valeurs des matrices globales. Lorsque j'essaie d'imprimer le nom de la matrice comme __Modulename_mod_arrayName, un grand nombre apparemment aléatoire est renvoyé. Si j'essaie d'imprimer un élément de la matrice, je reçois -Nan (0xf ...). Avez-vous une idée comment obtenir des tableaux d'imprimer correctement ainsi que des variables non-réseau?


Juste à noter sur mes progrès, j'ai essayé de construire avec Intel 11.1 (avec -O0 cette fois) et déboguer avec GDB, ainsi que toutes les variables globales et les matrices globales imprimées correctement. J'ai essayé de bâtir avec le G95 et le débogage avec GDB et les variables globales ne seront pas imprimés même lorsqu'ils sont construits avec -O0 (je dois utiliser la convention de dénomination énumérée ci-dessus pour les obtenir). Mais les matrices globales ne sont toujours pas imprimées. Donc, en résumé, il semble que c'est un problème avec Gfortran et G95 et non GDB. Et le bâtiment avec Intel 11.1 fonctionne bien.



6
votes

avec de nouveaux GDBS (7.2 si je me souviens correctement), les modules de débogage sont simples. Prenez le programme suivant: xxx

Vous pouvez maintenant exécuter: xxx


1 commentaires

Ce doit être GDB 7.2 que cela fonctionne car je n'ai que 7.1 installé sur mon système et la frappe "p modname :: var" reste toujours en "aucun symbole dans le contexte actuel". Toutefois, notez que tout ce problème semble être un problème de gfortran et non un problème de GDB, comme lorsque j'ai construit mon code source avec Intel Ifort 11.1, GDB n'avait eu aucun problème dans l'impression d'une variable ou d'une matrice globale ou globale. Bâtiment sans optimisation avec gfortran autorisé à imprimer des variables globales mais toujours des tableaux globaux.



0
votes

J'ai eu le même problème (GNU GDB 7.9 en cours d'exécution en parallèle avec MPI). Ce qui a fonctionné pour moi était le suivant:

p __modname_mod_var

C'est-à-dire: double trait de soulignement, nom du module, soussecore, mod, nom de la variable.

La compilation avec -gstabs + au lieu de -g peut également résoudre certains problèmes (mais pas le présent).


0 commentaires