디버깅과 프로파일링

디버깅과 프로파일링 (Debugging and Profiling)

이 라이브러리들은 Python 개발을 돕습니다. 디버거는 코드를 단계별로 실행하고 스택 프레임을 분석하며 중단점을 설정하는 등을 가능하게 하고, 프로파일러는 코드를 실행한 뒤 실행 시간의 상세 내역을 제공하여 프로그램의 병목 지점을 식별하게 해 줍니다. 감사(auditing) 이벤트는 그렇지 않으면 침습적인 디버깅이나 패치가 필요한 런타임 동작에 대한 가시성을 제공합니다.

출처: Python documentation

본문

이 장에 문서화된 주요 항목은 다음과 같습니다.

  • Audit events table — Python의 감사 이벤트 표.
  • bdb — 디버거 프레임워크(pdb가 기반으로 하는 저수준 디버거 모듈).
  • faulthandler — Python 트레이스백 덤프. 트레이스백 덤프, C 스택 덤프, 폴트 핸들러 상태, 타임아웃 후 트레이스백 덤프, 사용자 신호 시 트레이스백 덤프, 파일 디스크립터 문제, 예제를 다룹니다.
  • pdb — Python 디버거. 명령줄 인터페이스와 디버거 명령들을 다룹니다.
  • The Python Profilers — 프로파일러 소개, profilecProfile 모듈 참조, Stats 클래스, 결정론적 프로파일링이란 무엇인가, 제한 사항, 보정, 커스텀 타이머 사용.
  • timeit — 작은 코드 조각의 실행 시간 측정. 기본 예제, Python 인터페이스, 명령줄 인터페이스.
  • trace — Python 문 실행 추적. 명령줄 사용법, 프로그래밍 인터페이스.
  • tracemalloc — 메모리 할당 추적. 상위 10개 표시, 차이 계산, 메모리 블록의 트레이스백 얻기, API, 필터, 스냅샷, 통계 등.

디버깅과 프로파일링은 Python 개발 주기에서 핵심적인 활동입니다. pdb는 대화형 디버깅을 제공하여 코드를 단계별로 살펴보고 변수 값을 검사하며 중단점을 설정할 수 있게 합니다. faulthandler는 특히 크래시 시점의 트레이스백을 덤프하여 네이티브 충돌을 진단하는 데 유용합니다.

프로파일링 측면에서 cProfile은 결정론적 프로파일러로 함수별 호출 횟수와 소요 시간을 측정해 병목을 찾는 데 사용되고, profile은 순수 Python 구현입니다. timeit은 짧은 코드 조각의 실행 시간을 정확히 측정하는 데 특화되어 있으며, 주로 성능 비교에 사용됩니다.

메모리 관련해서 tracemalloc은 파이썬 메모리 할당을 추적하여 특정 코드 경로가 얼마나 많은 메모리를 점유하는지, 누수가 어디서 발생하는지를 파악하게 도와줍니다. trace는 문 실행 흐름을 추적하여 커버리지 측정과 프로그램 동작 이해에 사용합니다.

pdb는 명령줄과 프로그램 내에서 모두 사용할 수 있습니다. python -m pdb script.py로 스크립트를 디버그하거나, 코드 안에서 import pdb; pdb.set_trace()(또는 3.7+에서는 breakpoint())로 중단점을 걸 수 있습니다. n(next), s(step), c(continue), p(print), l(list), b(breakpoint) 같은 명령어를 제공합니다.

bdb는 디버거 프레임워크로, pdb가 이 저수준 모듈을 기반으로 빌드됩니다. 커스텀 디버거를 만들려면 bdb.Bdb를 서브클래싱합니다. 감사(auditing) 이벤트는 런타임 동작에 대한 가시성을 제공하여 보안 민감한 연산의 사용을 추적할 수 있게 합니다.

profile/cProfile은 결정론적 프로파일러로, python -m cProfile script.py로 실행하면 함수별 호출 횟수와 누적 시간이 담긴 통계를 얻고 pstats.Stats로 정렬·필터링해 분석할 수 있습니다. timeitpython -m timeit "..." 형태로 짧은 코드 조각의 타이밍을 재며, 최적의 알고리즘·구현을 고르는 데 유용합니다.

이처럼 디버깅과 프로파일링 모듈들을 조합하면 오류 진단, 성능 최적화, 메모리 분석, 코드 커버리지 측정 등 개발 전 단계를 체계적으로 지원할 수 있습니다.

더 알아보기 (Learn more)