본문 바로가기
카테고리 없음

[2025 완벽 가이드]파이썬 디버깅 마스터하기: PDB 완전 정복 | 고급 디버깅 기술

2025. 3. 18.
반응형

파이썬으로 개발하다 보면 코드가 예상대로 작동하지 않는 순간이 누구에게나 찾아옵니다. "왜 이 변수 값이 이상하지?", "어떻게 이 부분이 실행되는 거지?"라는 의문이 들 때, 많은 개발자들은 단순히 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()

💡 프로팁: 사후 분석 디버깅은 재현하기 어려운 버그를 조사할 때 특히 유용합니다. 예외가 발생한 정확한 상황에서 변수 상태를 검사할 수 있기 때문입니다.

반응형

댓글