2
나는 다음과 같은 포트란 95 코드를 한 : 나는 내가 GDB 7.7.1를 사용하여 프로그램을 실행하고 나는 중단 점을 설정 그리고 GDB와 포트란 모듈
gfortran -g -O0 problem.f95 -o problem
를 사용
MODULE ISSUE
IMPLICIT NONE
CONTAINS
SUBROUTINE PROBLEM(A)
IMPLICIT NONE
DOUBLE PRECISION, DIMENSION(:,:), INTENT(INOUT) :: A
INTEGER :: i, n
n = SIZE(A, 2)
DO i = 1, n
PRINT *, A(i, 1:n)
ENDDO
END SUBROUTINE PROBLEM
END MODULE ISSUE
PROGRAM TEST
USE ISSUE
IMPLICIT NONE
DOUBLE PRECISION, DIMENSION(5, 5) :: A
A = TRANSPOSE(RESHAPE((/ 1, 2, 3, 4, 5, &
6, 7, 8, 9, 0, &
1, 2, 3, 4, 5, &
6, 7, 8, 9, 0, &
1, 2, 3, 4, 5/), SHAPE(A)))
CALL PROBLEM(A)
END PROGRAM TEST
이제 컴파일 라인 11, (DO i = 1, n
). I 출력 1 기대
(gdb) break 11
Breakpoint 1 at 0x4008c5: file problem.f95, line 11.
(gdb) run
Starting program: /path_to_problem_folder/problem
Breakpoint 1, issue::problem (a=...) at problem.f95:11
warning: Source file is more recent than executable.
11 DO i = 1, n
(gdb) p A(1, 1)
$1 = 6.9533558074105031e-310
하지만 6.9533558074105031e-310은 GDB에 의해 인쇄된다 : 그 후, I는 행렬 A의 첫 번째 요소 I는 얻을 출력을 출력한다. 서브 루틴 PROBLEM
은 모든 값을 올바르게 인쇄합니다.
왜 이런 일이 발생하며 GDB를 사용하여 A(1, 1)
값을 올바르게 인쇄 할 수 있습니까?
경고 : 소스 파일이 실행 파일보다 최근입니다 .' 일반적으로 좋지 않습니다. 실행 파일이 디버거에 의해 다시로드되지 않았거나 소스에서 변경된 사항을 컴파일했다는 의미입니다. –
복사하기 전에 VIM으로 식별했기 때문입니다. StackOverflow에는이를 코드로 감지하기 위해 추가 TAB이 필요합니다. 디버거를 저장, 다시 컴파일 및 설정 한 후에도 문제가 지속됩니다. – MrParrot
데비안 sid x86_64 시스템에서 gdb 7.11.1 및 gfortran 6.2.0을 사용하여이 동작을 볼 수 없습니다. 아마도 gdb 및 gfortran의 버전을 사용하고 있는지 여부를 구체적으로 설명 할 수 있습니다. –