pdb
는 Python의 내장 디버거로, 코드를 실행하면서 특정 지점에서 멈추고 그 시점의 변수 상태를 확인하거나 코드 흐름을 단계별로 추적할 수 있는 강력한 도구입니다. 특히 복잡한 코드나 예기치 못한 오류가 발생하는 부분을 디버깅할 때 pdb
를 활용하면 문제의 원인을 빠르게 파악할 수 있습니다.
아래에서는 pdb
사용 방법을 기본부터 설명하고, 실제 코드에서 유용하게 쓸 수 있는 예제를 통해 pdb
의 효과적인 사용법을 알아보겠습니다.
1. pdb
기본 사용법: 중단점 설정으로 코드 흐름 추적하기
pdb
의 가장 기본적인 기능은 중단점(breakpoint)을 설정해 코드 실행을 멈추고 상태를 점검하는 것입니다. pdb.set_trace()
를 사용하면 원하는 지점에서 코드 실행이 멈춰, 변수 값이나 상태를 확인할 수 있습니다.
import pdb
def divide(a, b):
pdb.set_trace() # 코드가 이 지점에서 멈추고 디버깅 모드로 전환됩니다.
return a / b
# 실제 실행
print(divide(10, 2))
pdb
사용 방법
- 코드가
pdb.set_trace()
부분에서 멈추면, 디버깅 모드로 전환됩니다. - 명령어 예시:
n
(next): 현재 줄을 실행하고 다음 줄로 이동s
(step): 함수 내부로 진입하여 실행 흐름을 단계별로 확인c
(continue): 다음 중단점까지 실행q
(quit): 디버깅 종료
이렇게 pdb
를 통해 중단점을 설정하면, 각 변수의 현재 상태를 직접 확인하고 코드의 흐름을 추적할 수 있습니다.
2. pdb
로 특정 오류 위치 추적하기
특정 코드에서 예기치 않은 오류가 발생할 경우, try-except
블록을 사용하여 예외 발생 시 pdb
를 활성화할 수 있습니다. 이 방식은 오류가 발생한 정확한 위치에서 디버깅을 시작할 수 있어 문제를 신속히 파악하는 데 도움을 줍니다.
import pdb
def divide(a, b):
return a / b
try:
result = divide(10, 0) # ZeroDivisionError 발생
except Exception:
pdb.post_mortem() # 예외 발생 시 디버깅 모드로 전환
이 예제는 ZeroDivisionError
가 발생하면 자동으로 pdb
가 실행되어, 오류가 발생한 시점의 변수 값과 코드 흐름을 추적할 수 있습니다. 이를 통해 디버깅 속도를 높일 수 있습니다.
3. pdb
의 주요 명령어와 예제
pdb
의 기본 명령어는 디버깅할 때 코드 흐름을 단계별로 조작하는 데 사용됩니다. 자주 사용하는 몇 가지 명령어와 사용 예제를 소개합니다.
n
(next): 현재 줄을 실행하고 다음 줄로 이동합니다.s
(step): 함수 내부로 진입하여 코드 흐름을 확인합니다.c
(continue): 다음 중단점까지 코드를 실행합니다.p <변수명>
: 특정 변수의 현재 값을 출력합니다. 예:p a
l
(list): 주변 코드 줄을 표시하여 코드 흐름을 이해하는 데 도움을 줍니다.
예제
import pdb
def calculate_total(price, tax):
total = price + (price * tax)
pdb.set_trace() # 코드가 여기서 멈추고 디버깅 모드로 전환됩니다.
return total
# 실행
print(calculate_total(100, 0.1))
pdb.set_trace()
에서 실행이 멈추면 p price
, p tax
, p total
등을 입력하여 각 변수의 값을 즉시 확인할 수 있습니다. 이를 통해 계산 과정에서 오류가 발생하는지 쉽게 파악할 수 있습니다.
4. 조건부 중단점 설정하기
코드에서 특정 조건이 충족될 때만 중단점을 설정하고 싶다면, 조건부 중단점을 활용할 수 있습니다. 이렇게 설정하면 모든 반복에서 중단되지 않고, 특정 조건을 충족할 때만 멈추므로 효율적인 디버깅이 가능합니다.
import pdb
def check_number(num):
if num == 5:
pdb.set_trace() # num이 5일 때만 중단점이 활성화됩니다.
return num * 2
# 실제 실행
for i in range(10):
print(check_number(i))
이 예제에서는 num
이 5
일 때만 pdb
가 활성화됩니다. 특정 상황에서만 멈추고 싶을 때 조건부 중단점을 활용하면 코드 흐름을 정확히 파악할 수 있습니다.
5. 함수 호출 흐름을 따라가는 pdb
디버깅
pdb
는 함수 호출 구조를 한 줄씩 따라가며 확인할 수 있어, 전체 코드 흐름을 시각적으로 파악하는 데 유용합니다. 함수가 다른 함수 내에서 호출되는 상황에서 특히 유용합니다.
import pdb
def multiply(a, b):
return a * b
def divide(a, b):
pdb.set_trace() # 중단점 설정
return a / b
def calculate():
result1 = multiply(5, 4)
result2 = divide(result1, 2)
return result2
# 실제 실행
print(calculate())
pdb.set_trace()
가 설정된 divide
함수에서 코드가 멈추면, n
과 s
명령어를 통해 각 함수가 호출되는 과정을 한 단계씩 추적할 수 있습니다. 이를 통해 함수 호출 흐름을 보다 정확하게 이해할 수 있습니다.
6. pdb
대신 사용할 수 있는 대안: ipdb
와 VSCode 디버거
pdb
의 기본 기능에 더해 자동완성과 더 나은 UI를 제공하는 ipdb
는 pdb
의 대안으로 자주 사용됩니다. ipdb
는 pdb
와 동일한 명령어로 작동하나, 더 편리하게 사용할 수 있습니다.
# ipdb 설치
pip install ipdb
설치 후 pdb.set_trace()
대신 ipdb.set_trace()
를 사용하면, 보다 직관적인 디버깅을 경험할 수 있습니다.
또한, VSCode와 같은 IDE의 디버거도 강력한 대안입니다. VSCode 디버거는 코드 라인에서 클릭 한 번으로 중단점을 설정하고, 모든 변수를 직관적으로 확인할 수 있는 UI를 제공합니다. 여러 파일이나 모듈을 한 번에 디버깅해야 하는 복잡한 프로젝트에서 특히 유용합니다.
결론: pdb
를 활용한 효율적인 디버깅 습관
이제 pdb
의 기본 사용법과 함께 조건부 중단점, 오류 발생 시 자동 디버깅, 함수 호출 흐름 추적 등 다양한 기능을 알게 되었습니다. Python의 내장 디버거인 pdb
는 코드의 흐름을 정확히 이해하고 변수 상태를 확인하면서 문제를 빠르게 파악하는 데 큰 도움이 됩니다. 이제 print
디버깅에서 벗어나 pdb
로 한층 더 효율적인 디버깅을 시작해보세요!
'개발 > Python 스터디' 카테고리의 다른 글
[Python] `*`와 `**`를 함께 사용하기: 위치 인자와 키워드 인자 활용법 (0) | 2024.11.07 |
---|---|
[Python] `**` 문법으로 복잡한 코드를 간단하게: 딕셔너리 언패킹과 키워드 인자 사용법 (1) | 2024.11.06 |
[Python] `*` 문법 완벽 가이드: 함수 인자, 언패킹, 가변 인자까지 (2) | 2024.11.05 |
[Python] `pdb`와 데코레이터 활용 가이드: 특정 함수만 효율적으로 디버깅하기 (0) | 2024.11.04 |
[python] 파이썬 데코레이터 완벽 가이드: 다양한 데코레이터 활용 예제와 설명 (0) | 2024.11.03 |