Печать переменных при отладке - GDB не может печатать переменные, вычисленные в другой подпрограмме - PullRequest
1 голос
/ 13 декабря 2011

В настоящее время я отлаживаю код, написанный на фортране и скомпилированный с помощью gfortran.

У меня возникли проблемы при печати некоторых переменных с помощью gdb.

Например, когда я нахожусь внутрии я хочу напечатать переменную, которая приходит извне и имеет размер, который зависит от параметра, вычисленного в другой подпрограмме, похоже, что gdb не распознает размер матрицы и не может ее распечатать.

Ниже приведен упрощенный пример, чтобы он был понятен:

subroutine stiff(id)  
implicit real*8 (a-h,o-z)  
common /a/nnp  
dimension id(5,nnp)  

Вот некоторые результаты, которые дает gdb

(gdb) print id  
$6 = ()  
(gdb) whatis id  
type = integer(kind=4) (5,0)  
(gdb) print nnp  
$7 = 15  

Есть ли способ это исправить илиэто присуще способу программирования?Этот код был разработан кем-то другим и является огромным, поэтому я могу изменить весь способ объявления переменных.
Заранее благодарен за любую помощь.

edit:

См. Ниже aпростая программа (самое простое, что я мог).В целом он имеет ту же структуру, что и код, над которым я работаю, и то же поведение с GDB, которое я описал ранее.Находясь в подпрограмме ввода, я не могу напечатать переменную "id".

implicit real*8 (a-h,o-z)
dimension a(1000)
call markaz(a)
stop
end

subroutine markaz(a)

implicit real*8 (a-h,o-z)
dimension a(1000)    
common /a/nnn

call dim1(l1,l2)

call input(a(l1))

return
end

subroutine dim1(l1,l2)
implicit real*8 (a-h,o-z)
common /a/nnn     

print*, 'enter nnn:  ';read(*,*) nnn

l1=1
l2=l1+(nnn*5+1)/2

return
end

subroutine input(id)
implicit real*8 (a-h,o-z)
common /a/nnn     
dimension id(5,nnn)

do i=1,5
do j=1,nnn 
id(i,j)=1.0
enddo
enddo

return
end

Вот что я получаю с gfortran 4.4.5 и 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 <http://gnu.org/licenses/gpl.html>  
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-linux-gnu".  
For bug reporting instructions, please see:  
<http://www.gnu.org/software/gdb/bugs/>...  
Reading symbols from /test_print/a.out...done.  
(gdb) break test.for :36  
Breakpoint 1 at 0x400a7d: file test.for, line 36.  
(gdb) run  
Starting program: /test_print/a.out   
 enter nnn:    
2  

Breakpoint 1, input (id=...) at test.for:37  
37        do i=1,5  
Current language:  auto  
The current source language is "auto; currently fortran".  
(gdb) whatis id  
type = integer(kind=4) (5,0)  
(gdb) print id  
$1 = ()  
(gdb) print nnn  
$2 = 2  
(gdb)   

1 Ответ

0 голосов
/ 14 декабря 2011

Для меня ваш код хорошо работает с GDB.Протестировано с gfortran 4.5.5 и gdb 7.2.Не должно быть никаких ограничений этого стиля программирования.

[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 <http://gnu.org/licenses/gpl.html>
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:
<http://www.gnu.org/software/gdb/bugs/>...
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 
 enter 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) 
...