2 votes

Imprimer des variables lors du débogage - gdb ne peut pas imprimer les variables calculées dans une autre routine

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)

-1voto

Vladimir F Points 12375

Pour moi, votre code fonctionne bien avec gdb. Testé avec gfortran 4.5.5 et gdb 7.2. Il ne devrait y avoir aucune limitation inhérente à ce style de programmation.

[testy]$ gfortran -g -fbacktrace common2.f90

[testy]$ gdb ./a.out
GNU gdb (GDB) Red Hat Enterprise Linux (7.2-48.el6)
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later 
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
...
Reading symbols from /home/x/f/testy/a.out...done.
(gdb) break common2.f90:73
Breakpoint 1 at 0x400a2d: file common2.f90, line 73.
(gdb) run
Starting program: /home/x/f/testy/a.out 
 entrer nnn:  
4

Breakpoint 1, input (id=...) at common2.f90:73
73      do i=1,5
(gdb) whatis id
type = integer(kind=4) (5,4)
(gdb) print id
$1 = (( 0, 0, 0, 0, 0) ( 0, 0, 0, 0, 0) ( 0, 0, 0, 0, 0) ( 0, 0, 0, 0, 0) )
(gdb) print nnn
$2 = 4
(gdb)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X