다른 누군가가 작성한 Fortran 77 프로그램을 실행 중입니다. Linux (Ubuntu v.16.04)에서 gfortran 컴파일러 (v5.4.0)를 사용하고 있습니다. 나는 Fortran, gcc 또는 bash 스크립팅의 숙련 된 사용자가 아니므로 여기에서 고심하고 있습니다.gfortran 오류 추적 해석하기
내 프로그램이 실행 완료되면, 나는 다음과 같은 메시지가 얻을 :이를 지켜 볼 수밖에 없었습니다
Note: The following floating-point exceptions are signalling: IEEE_DENORMAL
- 나는 내 부동 소수점 숫자 중 일부는 "비정규"를 저장해야 이해를, 매우 작은 숫자에 대해서는 정밀도가 낮은 형식입니다 (0으로 플러시하지 않고). 이것들은 프로그램의 불안정한 공기 역학적 계산에서 나온 것입니다. 계산 길이를 할 때 이것을 보았습니다. 런타임에
gfortran –g –fbacktrace –ffpe-trap=invalid,zero,overflow,underflow,denormal –O3 –mcmodel=medium –o ../program.exe
이 프로그램은 컴파일 :하지만, 이들 비정규 수량이 크게 내 결과에 영향을 미치지 만, 이런 일이 이유, 나는 다음과 같은 오류 옵션을 사용하여 컴파일 시도 곳/시도하고 찾을 가능성은 적습니다 그것은 추락 반환
Program received signal SIGFPE: Floating-point exception - erroneous arithmetic operation.
Backtrace for this error:
#0 0x7F442F143E08
#1 0x7F442F142F90
#2 0x7F442EA8A4AF
#3 0x4428CF in subroutine2_ at code.f:3601 (discriminator 3)
#4 0x442C3F in subroutine1_ at code.f:3569
#5 0x4489DA in code_ at code.f:428
#6 0x42BdD1 in MAIN__ at main.f:235
Floating point exception (core dumped)
내가 6 세까지 거꾸로 작업, 통화의 계층 구조로 이러한 해석 할 수 있습니다 :
* 6. "main.f"의 235 행에 문제가있었습니다. [이것은 "code.f"에 대한 호출입니다]
* 5. "code.f"의 428 행에 문제가있었습니다. [이것은 "code.f"의 "subroutine1"에 대한 호출입니다]
* 4 "code.f"의 3569 행에서 "subroutine1"에 문제가있었습니다. [이것은 "code.f"의 "subroutine2"에 대한 호출입니다]
* 3. "code.f"의 3601 행에서 "subroutine2"에 문제가있었습니다. [이는 조건문]
if (windspd_2m.ge.5.0) then...
는 그래서 비정규 오류 (a)는 그 종속성의 길고 복잡한 시리즈를 포함하기 때문에 내가 그 코드를 포함하지 않은 (이하 "다음"작업에서 발생해야 , 그리고 (b) 나는 수학 오류를 풀 수 있는데, 그것은 내가 고민하고있는 디버그 오류이다.)
위의 오류 2,1,0에 대해 ...이 숫자/문자 열을 해석하는 방법을 모르겠습니다. 나는 또한 "discriminator 3"이 무엇을 의미하는지 모른다. 나는 이것들을 봤지만, 내가 찾은 유일한 자원은 내가 가진 것보다 더 높은 수준의 지식을 가진다고 설명한다. 누구든지 Fortran, gcc 또는 bash 스크립팅에 대한 사전 지식이 거의 없다고 가정하고 이러한 오류 코드를 해석하도록 도와 줄 수 있습니까?
당신은 올바른 길을 가고 있습니다. 프로그램은'-ffpe-trap = ... '을 사용하여 부동 소수점 예외에 대해 충돌한다고 말했기 때문에 프로그램이 충돌합니다. 상위 3 개의 스택 프레임은 라이브러리 또는 실제 오류 처리를 처리하는 내장 함수에 대한 호출 가능성이 가장 높습니다. 나는 그다지 걱정하지 않을 것입니다. – chw21
OK, thanks @ chw21!소스 코드에 들어가서 데님 소스를 찾는 것이 최선의 방법입니다. 계산에 데넘 번호를 남겨 두는 것이 합리적 일 수 있습니다. '-ffpe-trap'에 대한 더 자세한 내용을 살펴볼 것입니다. 프로그램을 중단하는 대신 경고를 생성 할 수 있다면 더 좋을 것입니다. –
* 편집 : "denom"은 "denormal"이어야합니다. –