Можно ли использовать GDB для печати значений размещаемых массивов производного типа в Fortran 90?

У меня есть следующая структура данных в программе Fortran90:

TYPE derivedType
  CHARACTER(100)     :: name      = ' '
  INTEGER            :: type      = 0
  REAL(KIND(1.0D0))  :: property  = 0.0
END TYPE derivedType

TYPE (derivedType), ALLOCATABLE, DIMENSION(:) :: arrayOfDerivedTypes

Когда я пытаюсь отлаживать и печатать значения в GDB, например:

(gdb) p arrayOfDerivedTypes(1)%name

Я получаю бессмысленные значения (часто строки нулей, косые черты и буквы) или совершенно неправильные значения (например, arrayOfDerivedTypes(1)%name = 9, когда я знаю, что это = 2). Как я могу заставить GDB печатать правильные значения?

Фон

Я знаю:

Я не хочу утруждать себя компиляцией отдельной ветки GDB, чтобы проверить, решает ли она эту проблему, если кто-то уже знает, что это не так, или если есть лучшее доступное решение.

Мне трудно представить, что решения этой проблемы еще нет. У сообщества Fortran еще нет лучшего решения для бесплатного отладчика?


person Neal Kruis    schedule 08.05.2013    source источник


Ответы (2)


Какую версию компилятора gdb и fortran (gfortran?) вы используете? Так как у меня нет проблем с

  • gdb — GNU gdb (GDB) Red Hat Enterprise Linux (7.2-56.el6)
  • gfortran — GNU Fortran (GCC) 4.4.6 20120305 (Red Hat 4.4.6-4)

Вот тестовая программа:

program test
        implicit none

        TYPE derivedType
                CHARACTER(100)     :: name      = ' '
                INTEGER            :: type      = 0
                REAL(KIND(1.0D0))  :: property  = 0.0
        END TYPE derivedType

        TYPE (derivedType), ALLOCATABLE, DIMENSION(:) :: arrayOfDerivedTypes

        allocate(arrayOfDerivedTypes(10))

        write(6,*) arrayOfDerivedTypes(1)%type

end program test

И я компилирую его как

gfortran -o test -g -O0 -Wall test.f90

Затем запустите отладчик, установите точку останова и запустите

$ gdb test
(gdb) break test.f90:14
Breakpoint 1 at 0x402c8a: file test.f90, line 14.
(gdb) r
[Thread debugging using libthread_db enabled]

Breakpoint 1, test () at test.f90:14
14              write(6,*) arrayOfDerivedTypes(1)%type
(gdb) p arrayOfDerivedTypes
$3 = (( ' ' <repeats 100 times>, 0, 0 ), ( ' ' <repeats 100 times>, 0, 0 ), ( ' ' <repeats 100 times>, 0, 0 ), ( ' ' <repeats 100 times>, 0, 0 ), ( ' ' <repeats 100 times>, 0, 0 ), ( ' ' <repeats 100 times>, 0, 0 ), ( ' ' <repeats 100 times>, 0, 0 ), ( ' ' <repeats 100 times>, 0, 0 ), ( ' ' <repeats 100 times>, 0, 0 ), ( ' ' <repeats 100 times>, 0, 0 ))
(gdb) p arrayOfDerivedTypes(1)
$4 = ( ' ' <repeats 100 times>, 0, 0 )
(gdb) p arrayOfDerivedTypes(1)%property
$5 = 0
(gdb) p arrayOfDerivedTypes(1)%name
$6 = ' ' <repeats 100 times>

Я все вижу.

Существует также http://brulermavie.org/2012/02/how-to-debug-fortran-programs-using-gdb/, который мне не помог, так как я не вижу проблемы.

person Timothy Brown    schedule 16.05.2013
comment
Я полагаю, что Red Hat поставляется с Archer GDB, который является ответвлением GDB, о котором я упоминал выше. Приятно знать, что отладка работает в Linux, но мне трудно заставить ее работать в других ОС. - person Neal Kruis; 16.05.2013
comment
Ссылка brulermavie.org/2012/02/how -to-debug-fortran-programs-using-gdb мертв. - person Michael-O; 21.05.2015

Я знаю, что ответ может быть немного неверным, но Sun studio (sdb) и Intel Fortran также поставляются с отладчиком.

person Jagte    schedule 23.10.2013