프로그램 디버깅용 옵션(Options for debugging your program)

프로그램 디버깅용 옵션(Options for debugging your program)

GNU Fortran이 프로그램을 디버깅할 때 쓰라고 마련해 둔 특별한 옵션들을 모아둔 문서예요. 부동소수점 예외를 잡는 트랩, 백트레이스, 내부 변수 노출 같은 것들이 핵심이에요.

출처: Debugging Options (The GNU Fortran Compiler)

본문

GNU Fortran에는 프로그램을 디버깅하기 위한 여러 가지 특별한 옵션이 있어요.

-fdebug-aux-vars

gfortran 프론트엔드가 만든 내부 변수 이름을 바꿔서 디버거가 접근할 수 있게 해줘요. 내부 변수 이름이 대문자 + 밑줄로 시작하게 돼요. 이 옵션은 -fdump-tree-original과 함께 컴파일러의 코드 생성을 디버깅할 때 유용하고, -g-ggdb3로 실행 프로그램의 디버깅을 켤 때도 유용해요.

-ffpe-trap=list

켤 부동소수점 예외 트랩 목록을 지정해요. 대부분의 시스템에서, 부동소수점 예외가 발생하고 그 예외에 대한 트랩이 켜져 있으면 SIGFPE 신호가 보내지면서 프로그램이 중단되고, 디버깅에 유용한 코어 파일이 생성돼요. list는 (비어 있을 수 있는) 쉼표로 구분된 목록으로, none(트랩할 예외 집합을 비움)이거나 다음 예외 중 하나 이상이에요.

  • invalid — 잘못된 부동소수점 연산(예: SQRT(-1.0))
  • zero — 0으로 나누기
  • overflow — 부동소수점 연산에서 오버플로우
  • underflow — 부동소수점 연산에서 언더플로우
  • inexact — 연산 중 정밀도 손실
  • denormal — 비정규(denormal) 값에 대한 연산

처음 다섯 개는 IEEE 754의 다섯 예외에 해당하고, 마지막 denormal은 IEEE 754 표준에는 없지만 x86 같은 일부 흔한 아키텍처에서 쓸 수 있어요.

처음 세 개의 예외(invalid, zero, overflow)는 흔히 심각한 오류를 나타내요. 프로그램이 이 예외를 처리할 수단을 갖추지 않았다면, 이 세 예외에 대한 트랩을 켜는 게 좋은 선택인 경우가 많아요.

이 옵션을 명령줄에 여러 번 쓰면 목록이 합쳐져요. -ffpe-trap=list1 -ffpe-trap=list2-ffpe-trap=list1,list2와 같아요.

주의할 점은, 한번 켠 예외는 끌 수 없다는 거예요(부정형이 없음). 다만 none을 지정해서 모든 트랩을 비우는 방법은 있어요.

대부분의 부동소수점 연산은 반올림 때문에 정밀도 손실이 생기므로, 실제로는 -ffpe-trap=inexact는 별 관심이 없을 가능성이 높아요.

기본적으로는 어떤 예외 트랩도 켜져 있지 않아요.

-ffpe-summary=list

STOPERROR STOP을 호출할 때 ERROR_UNIT으로 그 플래그 상태를 출력할 부동소수점 예외 목록을 지정해요. listnone, all, 또는 /invalid, zero, overflow, underflow, inexact, denormal 중 쉼표로 구분된 목록이에요.

이 옵션을 여러 번 쓰면 마지막 것만 사용돼요. 기본적으로는 inexact를 제외한 모든 예외에 대한 요약이 표시돼요.

-fno-backtrace

심각한 런타임 오류가 발생하거나 치명적인 신호(segmentation fault, 불법 명령, bus error, 부동소수점 예외, 그리고 core 동작을 갖는 다른 POSIX 신호)가 나오면, Fortran 런타임 라이브러리는 오류의 **백트레이스(backtrace)**를 출력하려고 해요. -fno-backtrace는 그 백트레이스 생성을 끄는 옵션이에요. 이 옵션은 Fortran 주 프로그램(main program)을 컴파일할 때만 영향을 줘요.

디버깅 옵션에 대한 더 자세한 내용은 GCC 사용 설명서의 디버깅 관련 절을 참고하면 돼요.

더 알아보기

  • -ffpe-trap-ffpe-summary는 짝을 이루는 옵션이에요. 트랩은 실행을 멈추게 하고, 요약은 간단한 진단만 출력한다는 차이가 있어요.
  • SIGFPE로 중단되는 동작을 활용하려면, 어떤 예외가 관심 대상인지 정확히 골라서 트랩을 켜는 게 좋아요. 무턱대고 전부 켜면 inexact 때문에 잡음이 많아질 수 있어요.
  • 백트레이스가 꼭 필요 없다면 -fno-backtrace로 끄면 코어 덤프 시 출력을 줄일 수 있는데, 보통은 백트레이스를 남겨 두는 편이 디버깅에 유리해요.