프로그램 디버깅용 옵션(Options for debugging your program)
프로그램 디버깅용 옵션(Options for debugging your program)
GNU Fortran이 프로그램을 디버깅할 때 쓰라고 마련해 둔 특별한 옵션들을 모아둔 문서예요. 부동소수점 예외를 잡는 트랩, 백트레이스, 내부 변수 노출 같은 것들이 핵심이에요.
본문
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
STOP과 ERROR STOP을 호출할 때 ERROR_UNIT으로 그 플래그 상태를 출력할 부동소수점 예외 목록을 지정해요. list는 none, 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로 끄면 코어 덤프 시 출력을 줄일 수 있는데, 보통은 백트레이스를 남겨 두는 편이 디버깅에 유리해요.