디버깅 술어

디버깅 술어

디버거를 실행·정지하고, 포트를 리싱(leash)하며, 스파이 포인트를 설정하는 술어들을 설명해요.

출처: GNU Prolog Manual - Debugging predicates

본문

디버거 실행·정지

  • trace/0 - 디버거를 활성화해요. 다음 술어 호출이 추적돼요.
  • debug/0 - 디버거를 활성화해요. 스파이 포인트가 설정된 술어의 다음 호출이 추적돼요.

제어 흐름과 관련된 정보는 디버거가 켜져 있을 때만 사용할 수 있다는 점을 이해하는 것이 중요해요. 효율성상 디버거가 꺼져 있으면 제어 흐름(즉 박스)에 관한 정보가 보존되지 않아요. 따라서 컴퓨테이션 도중(프로그램에서 debug/0trace/0를 호출하거나, 중단 키 시퀀스(Ctl-C) 후 tracedebug를 선택해) 디버거를 활성화하면 그 시점 이전의 정보는 사용할 수 없어요.

  • 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 술어에 조건부 스파이 포인트를 설정. 디버거가 조건부 스파이 포인트에 도달하면 다음 조건이 모두 검증될 때만 관련 목표를 보여줘요:
    1. 실제 목표가 Goal과 통일됨.
    2. 실제 포트가 Port와 통일됨.
    3. Prolog 목표 Test가 성공함.

더 알아보기