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 디버깅 vs 진짜 디버깅

print 문이 가장 단순한 버그 잡지만 문제 복잡해지면 눈멀게. pdb 가 Python 빌트인 디버거 — 코드 어떤 지점에 인터랙티브 REPL 로 떨어뜨림. 변수 검사, 줄별 단계, 현재 scope 의 식 평가. 기술 보상 거대, 많은 개발자가 안 배워서 매일 비용 지불.

breakpoint() — 현대 진입

Python 3.7+ 에 breakpoint() 빌트인. 코드 어디든 떨어뜨리면 거기서 실행 멈추고 pdb 로. env var PYTHONBREAKPOINT=ipdb.set_trace 가 설치돼있으면 더 풍부한 ipdb 디버거로 swap. PYTHONBREAKPOINT=0 가 breakpoint 완전 비활성화 (CI 에 유용).

실제 사용할 pdb 명령

n 다음 줄. s 함수 호출 안 step. c 계속 (다음 breakpoint 또는 끝까지). p expr 식 출력. l 현재 줄 주변 소스 list. w 호출 stack 표시. u/d stack 위/아래. q 종료. 첫 셋이 사용의 80%.

post-mortem — 예외 디버깅

코드 crash 했을 때 crash 지점에서 디버그 가능. python -m pdb script.py 가 pdb 아래 스크립트 실행. 인터랙티브 세션 안에서 예외 후 import pdb; pdb.pm() 이 일어난 frame 으로 떨어뜨림. 변수 여전히 scope 안 — 함수가 실제 본 거 검사 가능.

Pythonic Way: 버그가 즉시 명확하지 않으면 breakpoint() 떨어뜨리고 실제 값 봐. 제거해야 할 print 문 추가보다 빠름. IDE 디버거 (VS Code, PyCharm) 가 pdb 를 UI 로 감쌈, 기저 기술 같음.

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          종료
post-mortem — crash 사이트로 떨어짐·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 에서 함수가 본 거 검사할 때 유용
조건부 breakpoint — 코드 변경 없이·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) — 첫 음수 인덱스 반환, 없으면 -1. 일부러 loop 안에 breakpoint() 박아. [1, 2, -5, 3] 으로 호출하는 작은 스크립트 실행. pdb 프롬프트에서 p i, p x, n 으로 단계, c 로 계속. 그 다음 PYTHONBREAKPOINT=0 env var 로 breakpoint 비활성화 + 스크립트가 깔끔히 끝까지 실행 확인.

Progress

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

댓글 0

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

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