2017-10-10 10 views
5

다른 누군가가 작성한 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 스크립팅에 대한 사전 지식이 거의 없다고 가정하고 이러한 오류 코드를 해석하도록 도와 줄 수 있습니까?

+0

당신은 올바른 길을 가고 있습니다. 프로그램은'-ffpe-trap = ... '을 사용하여 부동 소수점 예외에 대해 충돌한다고 말했기 때문에 프로그램이 충돌합니다. 상위 3 개의 스택 프레임은 라이브러리 또는 실제 오류 처리를 처리하는 내장 함수에 대한 호출 가능성이 가장 높습니다. 나는 그다지 걱정하지 않을 것입니다. – chw21

+0

OK, thanks @ chw21!소스 코드에 들어가서 데님 소스를 찾는 것이 최선의 방법입니다. 계산에 데넘 번호를 남겨 두는 것이 합리적 일 수 있습니다. '-ffpe-trap'에 대한 더 자세한 내용을 살펴볼 것입니다. 프로그램을 중단하는 대신 경고를 생성 할 수 있다면 더 좋을 것입니다. –

+0

* 편집 : "denom"은 "denormal"이어야합니다. –

답변

2

처음 세 개의 스택 프레임은 GFortran 런타임 라이브러리 (libgfortran)에서 백 트레이스 구현으로 인해 발생합니다. 백 트레이스는 동적 라이브러리의 주소를 기호로 해석 할 수 없으므로 주소 만 가져옵니다. 기호 출력을 보려면 컴파일 옵션에 "-static"을 추가하십시오.

따라서 첫 번째 추측은 오류가 code.f : 3601에 있고, 5.0이 상수이기 때문에 windspd_2m이 비정규 적이어야한다는 것입니다.

+0

안녕하세요 @janneb, 감사합니다! 나는 역동적 인 라이브러리가 무엇인지 모르겠다. 그래서 나는 알아낼 것이다. 그리고 나는 지금 정적 옵션을 시도 할 것이다. code.f : 3601의 오류에 대한 결론은 맞지만 windsd_2m은 비정기 값이없는 기상 시계열에서 직접 그려집니다. 그것이 조건이기 때문에, 나는 그 오류가 "then"문장에 있다고 생각한다. 나는 그 블록이 꽤 크기 때문에 내 게시물에 "..."로 요약했다. 그 역 추적이 "discriminator 3"이 의미하는 것이면 ... "then"블록의 어느 부분이 신호를 보내고 있었는지를 가리키는 것이 아닌지 궁금합니다. –

+0

좋아요, 저는 정적 대 동적 연결에 대한 숙제를 다했습니다 - 중요하다고 생각합니다. 지식 기반에 추가하게되어 기쁩니다. 컴파일시 "-static"을 사용하면 해당 3 개 프레임의 심볼 출력이 반환됩니다. 그러나 출력은 gsignal, gfortran backtrace 처리기 및 gfortran backtrace 자체에 대한 호출이기 때문에 새로운 정보를 생성하지 않습니다. 따라서 오류는 code.f : 3601에서 시작하는 조건문 내의 어딘가에 있어야합니다. 내 수학을 검사 할 시간이야! –