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 안으로 들어가기, 현재 함수가 반환될 때까지 실행.dbnext는dbstep의 별칭이에요.isdebugmode()— 현재 디버깅 중인지 확인해요.
디버그 모드에서 RETURN 키를 누르면 마지막으로 입력한 명령을 다시 실행해요. 한 번 dbstep을 누른 뒤 줄 단위로 진행할 때 유용해요.
호출 스택(Call Stack)
디버깅 중인 함수가 여러 함수 호출의 말단 노드일 수 있어요. dbup/dbdown으로 호출 스택을 위아래로 이동해 변수가 처음으로 잘못된 값을 갖기 시작한 지점을 찾을 수 있어요. dbstack은 호출 함수 전체 시리즈와 현재 디버깅 레벨을 보여줘요.
더 알아보기
- Errors and Warnings — 오류와 경고
- Functions and Scripts — 함수와 스크립트 파일
- Statements — try/catch로 오류 처리