파이썬으로 개발하다 보면 코드가 예상대로 작동하지 않는 순간이 누구에게나 찾아옵니다.
"왜 이 변수 값이 이상하지?", "어떻게 이 부분이 실행되는 거지?"라는 의문이 들 때,
많은 개발자들은 단순히 print()
문을 이용해 문제를 해결하려 합니다.
하지만 진정한 파이썬 개발자라면 Python Debugger(PDB)를 마스터해야 합니다. PDB는 단순한 디버깅 도구가 아닌, 코드의 실행 흐름을 완벽하게 제어할 수 있는 강력한 무기입니다.
이 글에서는 PDB의 기초부터 고급 기능까지, 실전에서 바로 활용할 수 있는 파이썬 디버깅 핵심 기술을 모두 알려드립니다. 지금부터 디버깅의 대가로 거듭나는 여정을 시작해볼까요?
목차
1. 디버깅의 중요성과 PDB 소개
코드를 작성하는 시간보다 디버깅하는 시간이 더 길다는 말이 있습니다. 이는 많은 개발자들이 공감하는 현실입니다. 특히 복잡한 프로젝트에서는 버그를 찾고 수정하는 과정이 개발 시간의 50% 이상을 차지하기도 합니다.
효율적인 디버깅은 개발 생산성을 크게 향상시킵니다. 그럼에도 불구하고 많은 파이썬 개발자들은
print()
문을 남발하는 원시적인 방법에 의존하고 있습니다. 이런 방식은 다음과 같은 문제점이 있습니다:
- 코드를 수정한 후 다시 실행해야 함
- 프로그램의 상태를 충분히 파악하기 어려움
- 복잡한 로직에서는 효율성이 크게 떨어짐
- 디버깅용 코드를 나중에 제거해야 하는 번거로움
알고 계셨나요? 파이썬은 내장 디버거 PDB(Python DeBugger)를 제공합니다. 이 강력한 도구는 표준 라이브러리에 포함되어 있어 별도의 설치 없이 바로 사용할 수 있습니다!
PDB를 사용하면 코드의 실행을 원하는 시점에 중단하고, 변수 상태를 검사하며, 코드를 단계별로 실행하면서 실시간으로 문제를 분석할 수 있습니다. 이제 PDB를 마스터하여 디버깅의 효율성을 높이는 방법을 알아보겠습니다.
2. PDB 기본 사용법
2.1 PDB 시작하기
PDB를 사용하는 방법은 여러 가지가 있습니다. 가장 기본적인 3가지 방법을 알아보겠습니다.
방법 1: 코드에 breakpoint() 추가하기 (Python 3.7+)
def calculate_total(items):
total = 0
for item in items:
price = item['price'] * item['quantity']
breakpoint() # 여기서 코드 실행이 중단됩니다
total += price
return total
items = [{'name': '노트북', 'price': 1200000, 'quantity': 1},
{'name': '마우스', 'price': 30000, 'quantity': 2}]
result = calculate_total(items)
방법 2: import pdb 모듈 사용하기
import pdb
def complex_function(data):
# 코드 실행 중 특정 지점에서 디버거 시작
pdb.set_trace()
# 이후 코드는 디버거 모드에서 실행됩니다
result = process_data(data)
return result
방법 3: 명령줄에서 스크립트 실행 시 PDB 사용
python -m pdb my_script.py
💡 프로팁: Python 3.7 이상에서는 breakpoint()
함수가 추가되어 훨씬 간편하게 디버거를 시작할 수 있습니다.
import pdb; pdb.set_trace()
보다 간결하고 가독성이 높습니다!
2.2 필수 PDB 명령어
PDB를 효과적으로 사용하기 위해 알아야 할 핵심 명령어들이 있습니다. 이 명령어들만 제대로 익혀도 디버깅 효율이 크게 향상됩니다.
명령어 | 단축키 | 설명 |
---|---|---|
help |
h |
사용 가능한 명령어 목록 표시 |
next |
n |
다음 라인으로 이동 (함수 호출 시 내부로 들어가지 않음) |
step |
s |
다음 라인으로 이동 (함수 호출 시 내부로 들어감) |
continue |
c |
다음 중단점까지 계속 실행 |
return |
r |
현재 함수가 반환될 때까지 실행 |
print |
p |
변수 값 출력 |
list |
l |
현재 위치 주변의 소스 코드 표시 |
where |
w |
현재 실행 스택 표시 |
quit |
q |
디버거 종료 |
특히 n
(next)과 s
(step)의 차이점을 이해하는 것이 중요합니다.
next
는 함수 호출을 건너뛰고, step
은 함수 내부로 들어갑니다.
# PDB 실행 예시
> /path/to/your/script.py(10)calculate_total()
-> total += price
(Pdb) p item
{'name': '노트북', 'price': 1200000, 'quantity': 1}
(Pdb) p price
1200000
(Pdb) n
> /path/to/your/script.py(8)calculate_total()
-> for item in items:
(Pdb) c
⚠️ 주의: PDB 세션에서는 파이썬 코드를 직접 실행할 수 있습니다.
단순히 변수명을 입력하면 해당 변수의 값이 표시되지만,
p 변수명
형식을 사용하는 것이 좋은 습관입니다. 복잡한 표현식에서는 차이가 있을 수 있습니다.
지금까지 PDB의 기본적인 사용법을 살펴보았습니다. 기본 명령어만으로도 디버깅 효율이 크게 향상됩니다. 하지만 효과적인 디버깅을 위해서는 중단점을 잘 활용하는 것이 중요합니다. 다음 섹션에서 이에 대해 자세히 알아보겠습니다.
3. 효과적인 중단점(Breakpoint) 활용
중단점은 코드의 실행을 특정 위치에서 일시 중지하도록 하는 표시입니다. 효과적인 중단점 설정은 디버깅 시간을 크게 단축시킬 수 있습니다.
3.1 중단점 설정 방법
중단점을 설정하는 여러 방법을 알아보겠습니다.
방법 1: 코드에 직접 breakpoint() 추가
def process_data(data):
results = []
for item in data:
if item['status'] == 'active':
breakpoint() # 활성 항목에서만 중단
processed = complex_calculation(item)
results.append(processed)
return results
방법 2: PDB 세션에서 중단점 설정
(Pdb) b 25 # 25번 줄에 중단점 설정
Breakpoint 1 at /path/to/script.py:25
(Pdb) b my_module.py:42 # 다른 파일의 42번 줄에 중단점 설정
Breakpoint 2 at /path/to/my_module.py:42
방법 3: 함수 이름으로 중단점 설정
(Pdb) b my_module.process_payment # 함수 시작 부분에 중단점 설정
Breakpoint 3 at /path/to/my_module.py:78
💡 프로팁: tbreak
명령을 사용하면 일회성 중단점을 설정할 수 있습니다.
한 번 실행된 후에는 자동으로 제거되므로 특정 상황을 한 번만 확인할 때 유용합니다.
3.2 조건부 중단점
복잡한 코드에서는 특정 조건이 충족될 때만 실행을 중단하고 싶을 때가 있습니다. 조건부 중단점은 이런 상황에서 매우 유용합니다.
# 특정 조건에서만 중단하기
(Pdb) b 25, user_id == 12345
Breakpoint 1 at /path/to/script.py:25
(Pdb) b process_payment, amount > 1000000
Breakpoint 2 at /path/to/my_module.py:78
이 기능은 다음과 같은 상황에서 특히 유용합니다:
- 특정 사용자 ID나 계정에 관련된 버그 추적
- 큰 반복문에서 특정 반복 회차만 디버깅
- 오류가 발생하는 특정 입력 값 조건 확인
- 예외적인 상황이나 경계 조건 분석
실전 예시: 1000개의 주문을 처리하는 반복문에서 500번째 반복에서만 중단하고 싶다면:
(Pdb) b 42, i == 499 # 0부터 시작하는 인덱스 기준
3.3 중단점 관리하기
여러 중단점을 사용하는 경우 이를 효과적으로 관리하는 것이 중요합니다.
중단점 목록 확인
(Pdb) break # 또는 단순히 b
Num Type Disp Enb Where
1 breakpoint keep yes at /path/to/script.py:25
stop only if user_id == 12345
2 breakpoint keep yes at /path/to/my_module.py:78
stop only if amount > 1000000
중단점 비활성화/활성화
(Pdb) disable 1 # 1번 중단점 비활성화
(Pdb) enable 1 # 1번 중단점 다시 활성화
중단점 삭제
(Pdb) clear 2 # 2번 중단점 삭제
(Pdb) clear # 현재 줄의 중단점 삭제
(Pdb) clear all # 모든 중단점 삭제
⚠️ 주의: clear
명령어로 삭제한 중단점은 복구할 수 없습니다.
임시로 중단점을 비활성화하려면 disable
을 사용하세요.
4. PDB 고급 기능
기본 기능에 익숙해졌다면, 이제 PDB의 고급 기능을 살펴볼 차례입니다. 이 기능들을 활용하면 더욱 복잡한 디버깅 시나리오도 효과적으로 처리할 수 있습니다.
4.1 사후 분석 디버깅
프로그램이 예외로 인해 중단된 후에도 디버깅이 가능합니다. 이를 사후 분석(post-mortem) 디버깅이라고 합니다.
import pdb
try:
# 오류가 발생할 수 있는 코드
result = complex_calculation(data)
except Exception:
# 예외 발생 시 PDB 시작
pdb.post_mortem()
# 또는 pdb.pm() - 마지막으로 발생한 예외의 상태에서 디버거 시작
명령줄에서도 사후 분석 디버깅을 사용할 수 있습니다:
python -m pdb post_mortem.py
# 스크립트가 예외로 종료된 후
(Pdb) pm()
💡 프로팁: 사후 분석 디버깅은 재현하기 어려운 버그를 조사할 때 특히 유용합니다. 예외가 발생한 정확한 상황에서 변수 상태를 검사할 수 있기 때문입니다.
댓글