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))

이 예제에서는 num5일 때만 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 함수에서 코드가 멈추면, ns 명령어를 통해 각 함수가 호출되는 과정을 한 단계씩 추적할 수 있습니다. 이를 통해 함수 호출 흐름을 보다 정확하게 이해할 수 있습니다.


6. pdb 대신 사용할 수 있는 대안: ipdb와 VSCode 디버거

pdb의 기본 기능에 더해 자동완성과 더 나은 UI를 제공하는 ipdbpdb의 대안으로 자주 사용됩니다. ipdbpdb와 동일한 명령어로 작동하나, 더 편리하게 사용할 수 있습니다.

# ipdb 설치
pip install ipdb

설치 후 pdb.set_trace() 대신 ipdb.set_trace()를 사용하면, 보다 직관적인 디버깅을 경험할 수 있습니다.

또한, VSCode와 같은 IDE의 디버거도 강력한 대안입니다. VSCode 디버거는 코드 라인에서 클릭 한 번으로 중단점을 설정하고, 모든 변수를 직관적으로 확인할 수 있는 UI를 제공합니다. 여러 파일이나 모듈을 한 번에 디버깅해야 하는 복잡한 프로젝트에서 특히 유용합니다.


결론: pdb를 활용한 효율적인 디버깅 습관

이제 pdb의 기본 사용법과 함께 조건부 중단점, 오류 발생 시 자동 디버깅, 함수 호출 흐름 추적 등 다양한 기능을 알게 되었습니다. Python의 내장 디버거인 pdb는 코드의 흐름을 정확히 이해하고 변수 상태를 확인하면서 문제를 빠르게 파악하는 데 큰 도움이 됩니다. 이제 print 디버깅에서 벗어나 pdb로 한층 더 효율적인 디버깅을 시작해보세요!

+ Recent posts