디버깅
디버깅
Racket은 몇 가지 디버깅 보조 기능을 제공해요. 가장 흔히 쓰이는 도구는 함수 호출과 그 결과를 추적(trace)하는 데 사용하는 trace와 관련 형식들이에요. 추적을 통해 함수가 어떤 인자로 호출되는지, 어떤 값을 돌려주는지를 볼 수 있어요.
이 절에서는 추적 형식들과 런타임 디버깅에 영향을 주는 환경 변수를 다뤄요.
출처: Racket Reference
본문
Racket은 몇 가지 디버깅 보조 기능을 제공해요. 가장 흔히 쓰이는 도구는 trace와 관련된 형식들로, 함수 호출과 그 반환 값을 추적할 수 있게 해줘요.
syntax trace
(trace id ...)
(untrace id ...)
trace는 각 id에 바인딩된 함수에 대한 호출을 추적하도록 표시하고, untrace는 그 표시를 제거해요. id는 트레이스 가능한 값(주로 함수)에 바인딩되어야 해요.
추적된 함수가 호출되면, 인자들이 표준 오류 포트에 출력되고, 함수가 돌려주는 각 값도 출력돼요. 재귀 호출은 들여쓰기로 표시되어 호출 깊이를 알 수 있어요.
syntax trace-define
(trace-define id expr)
(trace-define (id . args) body ...+)
define처럼 id를 정의하되, 그 함수를 추적하도록 표시해요. 즉 trace를 정의에 통합한 형태예요.
syntax trace-define-syntax
(trace-define-syntax id expr)
define-syntax처럼 id를 정의하되, 매크로 확장을 추적하도록 표시해요.
syntax trace-lambda
(trace-lambda id formals body ...+)
lambda처럼 함수를 만들되, 그 함수를 추적하도록 표시해요. trace-lambda는 lambda의 id를 추적 라벨로 사용해요.
syntax trace-let
(trace-let id ([var init-expr] ...) body ...+)
let처럼 계산을 수행하되, 결과 값을 추적하도록 표시해요. trace-let은 named let과 함께 쓸 때 특히 유용해요.
추적 출력은 기본적으로 현재 오류 포트(current-error-port)로 보내지지만, trace 관련 형식들의 세부 출력 형식은 Racket 버전에 따라 달라질 수 있어요.
런타임 디버깅을 위한 환경 변수:
PLT_CS_DEBUG— CS 구현에서 머신 코드 모드 컴파일 시 디버깅 정보를 생성하도록 해요.PLT_CS_DEBUG가 활성화되면 생성되는 머신 코드가 훨씬 커지지만, 성능에는 그 외의 영향이 없어요. 자세한 내용은 「컴파일 제어와 검사」의 CS 컴파일 모드 절을 참고해요.PLT_LINKLET_SHOW— Racket 형식이 컴파일될 때마다 중간 컴파일 형식을 표준 오류에 표시해요. 자세한 내용은 「컴파일 제어와 검사」를 참고해요.PLTSTDERR— 특정 로깅 주제(예:'info,'linklet)의 출력을 제어해요. 예를 들어info@linklet로 설정하면 링클릿 주제의 정보 로그를 볼 수 있어요.
추적된 함수가 예외를 일으키면, 그 예외도 추적 출력에 반영되어 어디에서 문제가 발생했는지 파악하는 데 도움을 줘요.
프로그램 실행을 단계별로 살펴보는 더 강력한 도구로는 DrRacket의 디버거가 있으며, 이 절에서 다루는 추적은 그보다 가볍고 간단한 방식이에요.