디버깅 술어
디버깅 술어
디버거를 실행·정지하고, 포트를 리싱(leash)하며, 스파이 포인트를 설정하는 술어들을 설명해요.
본문
디버거 실행·정지
trace/0- 디버거를 활성화해요. 다음 술어 호출이 추적돼요.debug/0- 디버거를 활성화해요. 스파이 포인트가 설정된 술어의 다음 호출이 추적돼요.
제어 흐름과 관련된 정보는 디버거가 켜져 있을 때만 사용할 수 있다는 점을 이해하는 것이 중요해요. 효율성상 디버거가 꺼져 있으면 제어 흐름(즉 박스)에 관한 정보가 보존되지 않아요. 따라서 컴퓨테이션 도중(프로그램에서 debug/0나 trace/0를 호출하거나, 중단 키 시퀀스(Ctl-C) 후 trace나 debug를 선택해) 디버거를 활성화하면 그 시점 이전의 정보는 사용할 수 없어요.
debugging/0- 터미널에 현재 디버깅 상태에 관한 정보(디버거가 켜져 있는지, 리싱된 포트는 무엇인지, 정의된 스파이 포인트 등)를 출력해요.notrace/0또는nodebug/0- 디버거를 끔.wam_debug/0- WAM 데이터 구조 전용 하위 디버거를 호출(5.6절). W 디버거 명령어로도 호출할 수 있어요(5.5절).
포트 리싱(Leashing)
leash(Ports)는 사용자가 프로그램을 크릅(creep)하며 지나갈 때 Ports 목록에 정의된 모든 포트에서 디버거가 사용자에게 프롬프트를 요청하게 해요. Ports의 각 요소는 call, exit, redo, fail, exception 중 하나의 원자예요.
Ports는 약식(shorthand)을 정의하는 원자일 수도 있어요:
full-[call, exit, redo, fail, exception]과 동일.half-[call, redo]와 동일.loose-[call]과 동일.none-[]과 동일.tight-[call, redo, fail, exception]과 동일.
리싱되지 않은(unleashed) 포트를 만나면 디버거는 관련 목표를 계속 보여주지만 실행을 멈추고 사용자에게 프롬프트하지는 않아요.
스파이 포인트(Spy-points)
큰 소스를 다룰 때는 전체 프로그램을 크릅하는 것이 실용적이지 않아요. 관심 있는 술어에 스파이 포인트 집합을 정의해 디버거가 그 술어 중 하나에 도달하면 프롬프트를 받는 것이 좋아요. 스파이 포인트는 spy/1(또는 spypoint_condition/3)을 사용하거나, 디버거가 프롬프트할 때 +(또는 *) 디버거 명령어(5.5절)로 동적으로 추가할 수 있어요. 현재 리싱 모드는 스파이 포인트에 영향을 주지 않으며, 모든 포트에서 사용자 상호작용이 요청돼요.
spy(PredSpec)-PredSpec이 주는 모든 술어에 스파이 포인트를 설정.PredSpec은 하나 또는 여러 술어를 정의하며 다음 중 한 형태를 가져요:[PredSpec1, PredSpec2, ...]- 목록의 각 요소에 스파이 포인트를 설정.Name- 이름이Name인 어떤 술어든(아리티와 무관) 스파이 포인트를 설정.Name/Arity- 이름이Name이고 아리티가Arity인 술어에 스파이 포인트를 설정.Name/A1-A2- 이름이Name이고 아리티가 A1과 A2 사이인 각 술어에 스파이 포인트를 설정.
정의되지 않은 술어에는 스파이 포인트를 설정할 수 없어요. 다음 술어는 하나 또는 여러 스파이 포인트를 제거해요:
nospy(PredSpec)- 지정된 술어에서 스파이 포인트 제거.nospyall/0- 모든 스파이 포인트 제거.
조건부 스파이 포인트를 정의하는 것도 가능해요:
spypoint_condition(Goal, Port, Test)-Goal술어에 조건부 스파이 포인트를 설정. 디버거가 조건부 스파이 포인트에 도달하면 다음 조건이 모두 검증될 때만 관련 목표를 보여줘요:- 실제 목표가
Goal과 통일됨. - 실제 포트가
Port와 통일됨. - Prolog 목표
Test가 성공함.
- 실제 목표가