Я пытаюсь отладить программу на фортране, которая использует выделяемые массивы на OS X El Capitan (10.11.6)
.Программа скомпилирована с gfortran
(GNU Fortran (GCC) 8.1.0
), и я использую gdb
(GNU gdb (GDB) 8.1
).И gfortran
, и gdb
были построены из источника (инструкции: gfortran , gdb ).Моя проблема в том, что gdb
неправильно распознает / отображает размещаемые массивы.
Это старая и известная проблема , которая, похоже, была исправлена в последних дистрибутивах Linux.Поэтому я подозреваю, что это проблема только на OS X
.Далее я покажу минимальный, полный и проверяемый пример.
Проблема
Тестовая программа под названием test.f90:
program ex
implicit none
integer, parameter :: dp = kind(1.d0)
integer :: i
real(kind=dp),allocatable :: tab(:)
real(kind=dp) :: tab2(10)
allocate(tab(1:10))
do i=1,10
tab(i)=real(i,kind=dp)
tab2(i)=tab(i)
end do
write(*, '(*(f3.0,1x))') tab
write(*, '(*(f3.0,1x))') tab2
end program ex
Скомпилировано с использованием:
gfortran -g test.f90 -o test
Вызов gdb
для исполняемого файла:
gdb ./test
(gdb) b test.f90:12
(gdb) run
(gdb) info locals
i = 11
tab = ()
tab2 = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
(gdb) p &tab
$1 = (PTR TO -> ( real(kind=8) (*))) 0x7fff5fbff930
(gdb) p &tab2
$2 = (PTR TO -> ( real(kind=8) (10))) 0x7fff5fbff8e0
Обратите внимание, что размер выделяемой переменной tab
не печатается / распознается правильно в GDB.
Ожидаетсярезультат
На виртуальной машине Ubuntu с gdb
(GNU gdb (Ubuntu 8.0.1-0ubuntu1) 8.0.1
) и gfortran
(GNU Fortran (Ubuntu 7.2.0-8ubuntu3.2) 7.2.0
), компиляция и отладка с использованием тех же команд, что и выше, дают ожидаемый result:
(gdb) info locals
i = 11
tab = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
tab2 = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
(gdb) p &tab
$1 = (PTR TO -> ( real(kind=8) (10))) 0x55555575a240
(gdb) p &tab2
$2 = (PTR TO -> ( real(kind=8) (10))) 0x7fffffffd7f0
Таким образом, Ubuntu
, gdb
правильно сообщает о размере и содержании выделяемого массива tab
, идентичных tab2
.Как для Ubuntu
, так и OS X
фактический вывод программы такой же, как и ожидалось, а именно:
./test
1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Что я пробовал
Есть ряд связанных вопросов, ужеэтот сайт, но ни один, который я не могу найти, предлагает работающее решение (на более недавней OS X
версии, такой как El Capitan
).Предыдущие предложения были:
Я не могу найти пример работающей сборки ветки Project Archer gdb
на недавней версии OS X
.И мои собственные усилия по созданию ветки Project Archer по-прежнему приводят к gdb
, который не распечатывает правильно распределяемый массив.
Кажется, что gdb
установлен из, например, homebrew
также имеет эту проблему .Поэтому, если кто-нибудь может дать мне несколько советов о том, как получить или собрать версию gdb
для OS X El Capitan
(или более новую MacOS
, если необходимо), которая может печатать размещаемые массивы из gfortran
, я был бы очень признателен,В качестве альтернативы, любое объяснение того, почему это невозможно, также будет полезно.