GNU Octave 디버깅

GNU Octave 디버깅

스크립트 실행이 예상대로 흐르지 않을 때, Octave는 실행을 중단하고 한 줄씩 살펴볼 수 있는 디버그 모드를 제공해요. 스크립트 실행을 중단하는 방법은 크게 두 가지예요. 하나는 **중단점(breakpoint)**을 거는 것이고, 다른 하나는 어떤 조건에 따라 중단하는 거예요.

출처: GNU Octave 디버깅

본문

디버그 모드 진입

Octave는 설정값에 따라 세 가지 방식으로 실행을 중단할 수 있어요.

  • debug_on_interrupt — 인터럽트 신호(보통 C-c)를 받으면 디버그 모드로 들어가요.
  • debug_on_warning — 경고가 발생하면 디버거로 들어가요.
  • debug_on_error — 오류가 발생하면 디버거로 들어가요. 이때 일반 traceback 메시지 출력은 억제돼요.

중단점(Breakpoints)

중단점은 dbstop 함수로 어떤 m-file 함수에도 걸 수 있어요.

dbstop fcn
dbstop in fcn at line
dbstop in fcn at line if "condition"
  • fcn은 현재 경로에 있는 함수 이름이에요. 이미 디버그 모드에 있으면 생략하고 현재 함수를 써요. 하위 함수(subfunction)의 중단점은 범위 연산자 >로 지정해요. 예를 들어 file.m에 하위 함수 fcn2가 있다면 file>fcn2로 중단점을 걸 수 있어요.
  • line은 중단할 줄 번호예요. 생략하면 파일의 첫 실행 가능한 줄로 기본값이 정해져요.
  • condition은 중단점에서 평가할 Octave 표현식으로, 참일 때 실행이 멈춰요. 부작용이 있는 표현식(y++ > 1 같은)은 변수를 바꾸니 피하는 게 좋아요.

특정 함수와 줄이 아니라 이벤트로도 디버그 모드에 들어갈 수 있어요. dbstop if error(오류 발생 시, debug_on_error(true) + debug_on_interrupt(true)와 동일), dbstop if interrupt(Ctrl-C), dbstop if warning(경고 발생 시) 등이 있어요. error·warning 이벤트 뒤에는 오류/경고 ID 문자열을 붙여 특정 ID에만 멈추게 할 수도 있어요.

dbclear는 같은 문법으로 중단점·이벤트를 지우고, dbstatus는 활성 중단점의 위치를 보고해요. 모든 중단점을 저장했다가 되살리려면 bp_state = dbstatus; ...; dbstop (bp_state)처럼 써요.

중단점은 내장 함수(sin 등)나 동적 로드 함수(oct-file)에는 걸 수 없어요. 파일이 외부에서 수정되는 등 재파싱되면 그 파일의 중단점은 모두 지워져요.

스크립트 안에서 직접 디버그 모드로 들어가고 싶을 때는 keyboard 함수를 써요. 실행을 멈추고 debug> 프롬프트에서 변수 값을 확인하고 새 값을 대입할 수 있어요. return이나 dbcont로 정상 실행으로 돌아와요.

디버그 모드에서 작업하기

  • dbcont 또는 return — 디버그 모드를 떠나 정상 실행을 계속해요.
  • dbquit — 추가 코드 실행 없이 디버그 모드를 즉시 빠져나가요. dbquit all은 모든 디버그 레벨을 빠져나가 프롬프트로 돌아가요.
  • dbwhere — 현재 멈춰 있는 파일과 줄 번호를 보고해요.
  • dbtype [fcn] [range] — 줄 번호가 매겨진 스크립트 파일을 보여줘요.
  • dblist [n] — 현재 실행할 줄 주변의 함수 n줄(기본 10줄)을 보여줘요.
  • dbstep [n] / dbstep in / dbstep out — 다음 n줄 실행, 다음 줄의 m-file 안으로 들어가기, 현재 함수가 반환될 때까지 실행. dbnextdbstep의 별칭이에요.
  • isdebugmode() — 현재 디버깅 중인지 확인해요.

디버그 모드에서 RETURN 키를 누르면 마지막으로 입력한 명령을 다시 실행해요. 한 번 dbstep을 누른 뒤 줄 단위로 진행할 때 유용해요.

호출 스택(Call Stack)

디버깅 중인 함수가 여러 함수 호출의 말단 노드일 수 있어요. dbup/dbdown으로 호출 스택을 위아래로 이동해 변수가 처음으로 잘못된 값을 갖기 시작한 지점을 찾을 수 있어요. dbstack은 호출 함수 전체 시리즈와 현재 디버깅 레벨을 보여줘요.

더 알아보기