Установить точки останова данных в GDB для исполняемого файла Fortran? - PullRequest
0 голосов
/ 03 апреля 2020

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

Мотивация

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

I не удалось установить точки прерывания данных для исполняемого файла, созданного с помощью GFortran и Intel Fortran. Также не помогает, что документация Intel для точек прерывания данных охватывает только Windows.

Пример

В целях тестирования я использую следующую настройку:

! persons.f90
module mperson
  implicit none

  type :: person
     integer :: age = 0
     character(16) :: name
  end type person

  type(person), allocatable :: persons(:)

contains

  subroutine init_persons(ages, names)
    integer, intent(in) :: ages(:)
    character(*), intent(in) :: names(:)
    integer iPerson

    allocate(persons(size(ages)))
    do iPerson = 1, size(ages)
      persons(iPerson) = person(ages(iPerson), names(iPerson))
    end do
  end subroutine init_persons

  subroutine print_persons()
    integer iPerson
    print '("-------- print_persons --------")'
    do iPerson = 1, size(persons)
      print *, persons(iPerson)
    end do
    persons(2) = person(-1, "undefined")   ! <-- This I would like to catch.
  end subroutine print_persons

end module mperson

program main
  use mperson
  implicit none

  call init_persons([18,42,13], [character(16)::'Alex', 'Max', 'Bobby Tables'])
  call print_persons()
  call print_persons()
contains

end program main

Отлажено с помощью:

(bash) ifort -g -traceback persons.f90 -o persons.bin
(bash) gdb persons.bin
(gdb) break persons.f90:main
(gdb) run
...