2012-04-18 3 views
2

일부 코드에는 gfortran이 사용됩니다. 잠시 동안 나는 버그를 찾아 내려고 시도하여gfortran은 부동 소수점 예외에 대해 경고합니다.

-ffpe-trap=zero,overflow,invalid 

으로 컴파일 중이었습니다. 이로 인해 프로그램 실행이 즉시 중단됩니다. FPE가 정상적인 경우가 있으므로 다음과 같은 플래그가 표시됩니다.

-ffpe-warn=zero,overflow,invalid 

매우 유용합니다. gfortran (또는 다른 컴파일러)이 이와 같은 것을 제공합니까? 그렇지 않은 경우 해결 방법이 있습니까? 현재의 생각은 경고를 작성하는 신호 처리기를 등록하는 C 함수를 만드는 것입니다. 경고를 작성하는 방법에 대해서는 알지 못합니다.

+1

이 추정 런타임 경고 메커니즘은 어떻게 작동합니까? –

+3

gfortran은 (비교적 새로운) ieee_arithmetic 내장 모듈을 제공합니까? 그렇다면 Fortran에서 f-p '오류'트래핑을 수행하는 데 필요한 도구를 제공합니다. –

+0

@DavidHefferman 런타임 예외가 발생하면 실행이 중지되고 예외가 발생한 위치와 프로그램이 종료되는 위치에 대한 메시지가 인쇄됩니다. 예외가 발생했을 때 (stderr에 대한 메시지 일 가능성이있는 경우) 알림을 받고 싶습니다. 실행을 계속할 수 있습니다. 어쩌면 그건 불가능합니다 ... 나는이 일들이 어떻게 작동하는지에 대해 너무 많이 알지 못합니다 ... – mgilson

답변

4

부동 소수점 예외가 발생할 경우 경고 방법을 모르겠습니다. 그러나 gfortran과 ifort는 신호 처리 루틴을 가지고 있습니다. 예를 들어 signal 및 인 인텔 포트란 컴파일러 User and Reference Guides (warning: large PDF) (구에 대해서는 410 페이지 참조)의 gfortran 설명서를 참조하십시오.

당신은 signal를 호출 신호에 대해 다음 작업 중 하나를 설정할 수 있습니다 :

  • 이 (번호로 식별) 지정된 신호를 무시합니다.
  • 지정된 신호에 대해 기본 동작을 사용하면 이전에 설정된 동작을 재설정 할 수 있습니다.
  • 지정된 신호에서 이름을 사용하여 신호를 수신하는 프로 시저로 제어를 전송합니다. 귀하의 경우에는

, 당신은 부동 소수점 예외가 (예를 들어, 인쇄 파일 이름/행 번호)를 발생했을 때 뭔가를 할 수있는 함수를 작성하고, 위의 목록에서 세 번째 옵션을 사용하고자하는 것입니다.

불행하게도 이것은 매우 이식성이 없습니다 : 다양한 컴파일러에 대한 신호 처리의 예는 this page을보십시오. 여러 컴파일러

  • 일부 처리기 플래그가 설정되어있는 경우 신호 처리 루틴을 사용 (참조 -NDEBUG)
  • 업데이트로 컴파일

    • 원하는 경우 처리기 매크로에 몇 가지 코드를 래핑 수 : 궁극적으로 고성능 표에 제안 된대로 ieee_exceptions 내장 모듈의 예외 처리 기능이이를 수행하는 휴대용 방법입니다.

    +0

    Fortran의 신호 처리에 대해 알아두면 좋을 것입니다. C에서이 부분을 좀 더 표준화했기 때문에 아마 그렇게 할 것입니다. 난 아직도 줄 번호/파일 이름/예외를 어디서 어떻게 stacktrace를 얻을 수 있을지 모르겠다 - 조금 주위에 인터넷 검색은 내가 꽤 지저분한 사업이라고 생각하게합니다. – mgilson