GDB에서 Fortran 90 런타임 오류를 포착하고 중단하는 방법은 무엇입니까?

GDB에서 Fortran 90 런타임 오류를 포착하고 중단하는 방법은 무엇입니까?

GDB의 런타임 오류로 인해 Fortran 90이 중단될 수 있습니까? 여기서는 MWE의 간단한 루틴을 보여줍니다테스트.f90범위를 벗어난 오류가 발생합니다.

program main
  implicit none
  integer              :: i
  integer, parameter   :: npt = 10
  real, dimension(npt) :: A
  real                 :: B
  !
  do i = 1,npt
     A(i) = i
  enddo
  B = A(npt+1)
  !
end program main

나는 그것을 다음과 같이 컴파일한다:

gfortran test.f90 -O0  -fbacktrace  -fbounds-check -g -Wall -w -o test.x 

기본적으로 예상대로 추적은 다음과 같습니다.

Error termination. Backtrace:
#0  0x7ffff7a0f2ed in ???
#1  0x7ffff7a0fed5 in ???
#2  0x7ffff7a102a7 in ???
#3  0x55555555480e in MAIN__
    at ~/test.f90:11
#4  0x555555554844 in main
    at ~/test.f90:13

GDB에서 실행할 때 catch catch캡처 catch throw지점을 설정했지만 GDB를 실행할 때 여전히 프로그램이 종료되고 볼 프레임이 없습니다.

(gdb) catch catch
Catchpoint 1 (catch)
(gdb) catch throw
Catchpoint 2 (throw)
(gdb) r test.x
`~/test.x' has changed; re-reading symbols.
Starting program: ~/test.x test.x
warning: Probes-based dynamic linker interface failed.
Reverting to original interface.
[Inferior 1 (process 3769) exited normally]
(gdb) where
No stack.
(gdb) bt
No stack.
(gdb) 

GDB가 이와 같은 오류를 포착하고 범인으로부터 디버깅을 시작하도록 하려면 어떻게 해야 합니까? 분명히 작은 스크립트에서는 유용한 중단점을 식별하기 쉽지만 대규모 레거시 Fortran 코드에서는 많은 시간과 노력을 절약할 수 있습니다.

답변1

로 이 작업을 수행할 수 있는지는 모르겠지만 catch, 중단을 설정한 _gfortran_runtime_error_at다음 역추적에서 범인 행을 식별해 볼 수 있습니다(그런 다음 거기에 중단점을 설정하는 등).

$ gdb -q ./test.x
Reading symbols from ./test.x...done.
(gdb) br _gfortran_runtime_error_at
Breakpoint 1 at 0x1030
(gdb) r
Starting program: /tmp/test.x

Breakpoint 1, 0x00007ffff7d5e670 in _gfortran_runtime_error_at ()
   from /lib/x86_64-linux-gnu/libgfortran.so.5
(gdb) bt
#0  0x00007ffff7d5e670 in _gfortran_runtime_error_at ()
   from /lib/x86_64-linux-gnu/libgfortran.so.5
#1  0x00005555555551fa in MAIN__ () at test.f90:11
(gdb) fram 1
#1  0x00005555555551fa in MAIN__ () at test.f90:11
11        B = A(npt+1)

관련 정보