본문 바로가기
C.W.K.
Stream
Lesson 03 of 05 · published

pdb와 breakpoint — 실행을 멈추고 증거 보기

~15 min · pdb, breakpoint, debugger

Level 0호기심
0 XP0/93 lessons0/23 achievements
0/100 XP to next level100 XP to go0% complete

print는 단순한 버그에는 충분하지만 상태가 얽히면 추적문만 늘어. Python 내장 디버거인 pdb는 멈춘 프레임의 변수를 보고 식을 계산하며 줄과 호출 스택을 오가게 해. n은 다음 줄, s는 함수 안, c는 계속, p는 값, l은 소스, w는 스택, u/d는 프레임 이동, q는 종료야.

Python 3.7+의 breakpoint()가 기본 진입점이야. PYTHONBREAKPOINT로 ipdb 같은 다른 디버거를 고르거나 0으로 꺼. python -m pdb script.py로 처음부터 실행할 수도 있고, 예외 뒤 pdb.pm()으로 실패 프레임을 조사할 수도 있어.

멈춘 자리에서 값을 임시로 바꿔 통과시킨 건 수정이 아니야. 관찰로 가설을 세우고 소스를 고친 다음 같은 입력에서 재현이 사라졌는지 다시 확인해.

Code

breakpoint로 멈추기·python
def buggy(items):
    total = 0
    for x in items:
        breakpoint()                   # 여기서 pdb 로 떨어짐
        total += x * 2
    return total

# buggy([1, 2, 3])
# (Pdb) p x          — 현재 x 검사
# 1
# (Pdb) p total
# 0
# (Pdb) n             — 다음 줄
# (Pdb) c             — 다음 breakpoint 또는 끝까지 계속
자주 쓰는 pdb 명령·python
# pdb 프롬프트 안:
#
# n          다음 줄 (함수 호출 skip)
# s          step (함수 호출 안)
# c          계속 (다음 breakpoint 까지)
# p expr     식 출력
# pp expr    pretty-print
# l          현재 줄 주변 소스 list
# ll         전체 현재 함수 list
# w          where (호출 stack)
# u          up (stack 위로)
# d          down (stack 아래로)
# b N        N 줄에 breakpoint
# b file:N   file:N 에 breakpoint
# h          help
# h cmd      특정 명령 도움말
# q          종료
예외 뒤 실패 프레임 조사하기·python
# pdb 아래 crash 하는 스크립트 실행:
# python -m pdb script.py
# 프롬프트에서 c 로 시작, crash 에 도착

# 인터랙티브 세션 안:
import pdb

def bad():
    items = [1, 2, 3]
    return items[10]

try:
    bad()
except IndexError:
    pdb.post_mortem()
# (Pdb) p items
# [1, 2, 3]
# (Pdb) p len(items)
# 3
# REPL 에서 함수가 본 거 검사할 때 유용
코드를 바꾸지 않고 조건부 중단하기·python
# pdb 프롬프트에서:
#
# b file.py:42, x > 100
# x > 100 일 때만 발동하는 file.py 42 줄 breakpoint
#
# 유용 — '이 루프가 백만 번 반복, 특정 일 발생 시만 멈춤'

# 또는 코드에서 조건부 breakpoint() 호출
def process(items):
    for i, x in enumerate(items):
        if x < 0:
            breakpoint()        # 음수에만 멈춤
        # x 처리

External links

Exercise

find_first_negative(nums)의 반복문 안에 breakpoint를 두고 [1, 2, -5, 3]을 넣어. pdb에서 p i, p x, n으로 상태를 따라가고 c로 끝낸 뒤 PYTHONBREAKPOINT=0에서도 스크립트가 끝까지 실행되는지 확인해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.