Je suis actuellement en train de déboguer un code écrit en fortran et compilé avec gfortran.
J'ai rencontré des problèmes pour afficher certaines variables avec gdb.
Par exemple, lorsque je suis à l'intérieur d'une sous-routine et que je veux afficher une variable qui provient de "l'extérieur" et qui a une taille qui dépend d'un paramètre calculé dans une autre sous-routine, gdb semble ne pas reconnaître la taille de la matrice et ne peut pas l'afficher.
Je donne ci-dessous un exemple simplifié pour que ce soit clair :
sous-routine stiff(id)
implicite real*8 (a-h,o-z)
commun /a/nnp
dimension id(5,nnp)
Voici quelques résultats donnés par gdb
(gdb) print id
$6 = ()
(gdb) whatis id
type = integer(kind=4) (5,0)
(gdb) print nnp
$7 = 15
Y a-t-il un moyen de corriger cela ou est-ce inhérent à la façon de programmer ? Ce code a été développé par quelqu'un d'autre et est énorme, donc je ne peux pas changer la façon de déclarer les variables.
Merci d'avance pour toute aide.
éditer :
Voici un programme simple ci-dessous. Il a globalement la même structure que le code sur lequel je travaille et le même comportement avec gdb que j'ai décrit précédemment. Lorsque je suis dans la sous-routine d'entrée je ne peux pas afficher la variable "id".
implicite real*8 (a-h,o-z)
dimension a(1000)
call markaz(a)
stop
end
sous-routine markaz(a)
implicite real*8 (a-h,o-z)
dimension a(1000)
commun /a/nnn
appel dim1(l1,l2)
appel input(a(l1))
fin
end
sous-routine dim1(l1,l2)
implicite real*8 (a-h,o-z)
commun /a/nnn
print*, 'entrer nnn: ';read(*,*) nnn
l1=1
l2=l1+(nnn*5+1)/2
fin
end
sous-routine input(id)
implicite real*8 (a-h,o-z)
commun /a/nnn
dimension id(5,nnn)
faire i=1,5
faire j=1,nnn
id(i,j)=1.0
fin
fin
fin
end
Voici ce que j'obtiens avec gfortran 4.4.5 et gdb 7.0.1
$ gfortran -g -fbacktrace test.for
$ gdb ./a.out
GNU gdb (GDB) 7.0.1-debian
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later
Ceci est un logiciel libre : vous êtes libre de le modifier et de le redistribuer.
Aucune garantie n'est fournie, dans la mesure permise par la loi. Tapez "show copying"
et "show warranty" pour plus de détails.
Ce GDB a été configuré en tant que "x86_64-linux-gnu".
Pour les instructions de signalement de bogues, veuillez consulter :
...
Lecture des symboles depuis /test_print/a.out...done.
(gdb) break test.for :36
Point d'arrêt 1 at 0x400a7d: fichier test.for, ligne 36.
(gdb) run
Démarrage du programme : /test_print/a.out
entrer nnn:
2
Point d'arrêt 1, input (id=...) at test.for:37
37 faire i=1,5
Langage actuel : auto
Le langage source actuel est "auto; actuellement fortran".
(gdb) whatis id
type = integer(kind=4) (5,0)
(gdb) print id
$1 = ()
(gdb) print nnn
$2 = 2
(gdb)