Python 고급

Python 코드 디버깅 기법

PyExplorer 2025. 1. 16. 08:52
728x90

Python 코드 디버깅 기법

소프트웨어 개발에서 디버깅은 필수적인 과정입니다. 코드가 예상대로 동작하지 않을 때 문제를 찾아내고 수정하는 과정을 디버깅이라고 합니다. Python에서는 디버깅을 효과적으로 수행할 수 있는 다양한 도구와 기법을 제공합니다. 이 포스팅에서는 Python 디버깅 도구인 pdblogging을 활용하는 방법을 예제와 함께 살펴보겠습니다.


1. pdb(Python Debugger)

pdb는 Python 표준 라이브러리에서 제공하는 디버깅 도구로, 코드 실행 중간에 멈춰서 변수 상태를 확인하거나 코드를 한 줄씩 실행하면서 동작을 추적할 수 있습니다.

1.1 기본 사용법

pdb를 사용하려면 코드에서 중단점을 설정해야 합니다. Python 3.7 이상에서는 breakpoint() 함수를 사용하여 간단히 중단점을 설정할 수 있습니다.

# 예제 1: pdb 기본 사용

def buggy_function(a, b):
    result = a + b
    breakpoint()  # 중단점 설정
    result *= 2
    return result

if __name__ == "__main__":
    print(buggy_function(2, 3))

위 코드를 실행하면 breakpoint()에서 실행이 멈춥니다. 명령어를 입력하여 디버깅을 진행할 수 있습니다.

1.2 주요 명령어

pdb에서 사용할 수 있는 주요 명령어는 다음과 같습니다:

  • n(next): 현재 줄을 실행하고 다음 줄로 이동합니다.
  • s(step): 함수 내부로 들어가 디버깅을 계속합니다.
  • c(continue): 다음 중단점까지 실행을 계속합니다.
  • l(list): 현재 코드의 주변 줄을 보여줍니다.
  • p(print): 변수를 출력합니다.
  • q(quit): 디버깅을 종료합니다.

1.3 실제 예제

다음은 리스트의 요소를 합산하는 함수에서 발생한 오류를 pdb로 디버깅하는 예제입니다.

# 예제 2: 리스트 합산 오류 디버깅

def sum_list(lst):
    total = 0
    for item in lst:
        breakpoint()
        total += item
    return total

if __name__ == "__main__":
    numbers = [1, 2, '3', 4]  # 오류를 발생시키는 데이터
    print(sum_list(numbers))

breakpoint()에서 멈춘 후 p item을 입력하면 현재 item 값을 확인할 수 있습니다. 이 예제에서는 문자열 '3'이 오류를 발생시킴을 알 수 있습니다.


2. logging 모듈

logging 모듈은 프로그램 실행 중에 발생하는 이벤트를 기록할 수 있는 강력한 도구입니다. 디버깅뿐만 아니라 프로그램의 동작을 모니터링하는 데에도 유용합니다.

2.1 기본 설정

logging을 사용하려면 로그 레벨과 출력 형식을 설정해야 합니다. 다음은 간단한 설정 예제입니다:

import logging

# 로깅 기본 설정
logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s - %(levelname)s - %(message)s')

logging.debug("디버깅 메시지입니다.")
logging.info("정보 메시지입니다.")
logging.warning("경고 메시지입니다.")
logging.error("에러 메시지입니다.")
logging.critical("치명적인 에러 메시지입니다.")

2.2 로그 레벨

로그 레벨은 중요도에 따라 메시지를 구분합니다. 기본 로그 레벨은 다음과 같습니다:

  • DEBUG: 상세한 정보
  • INFO: 일반적인 정보
  • WARNING: 경고 메시지
  • ERROR: 오류 메시지
  • CRITICAL: 심각한 오류

2.3 파일에 로그 저장

로그를 파일에 저장하면 프로그램 실행 후에도 기록을 확인할 수 있습니다.

import logging

logging.basicConfig(filename='app.log', level=logging.DEBUG,
                    format='%(asctime)s - %(levelname)s - %(message)s')

logging.info("이 메시지는 파일에 저장됩니다.")

2.4 실제 예제

다음은 파일 처리 중 발생하는 오류를 기록하는 예제입니다:

# 예제 3: 파일 처리 로그 기록

import logging

logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s - %(levelname)s - %(message)s')

def process_file(file_name):
    logging.info(f"파일 처리 시작: {file_name}")
    try:
        with open(file_name, 'r') as file:
            data = file.read()
        logging.debug(f"파일 내용: {data}")
    except FileNotFoundError:
        logging.error(f"파일을 찾을 수 없습니다: {file_name}")
    except Exception as e:
        logging.critical(f"예상치 못한 오류 발생: {e}")

if __name__ == "__main__":
    process_file("example.txt")

3. pdb와 logging을 결합한 디버깅

pdblogging을 함께 사용하면 디버깅 과정을 더욱 효과적으로 수행할 수 있습니다. logging으로 기록한 정보를 참고하면서 pdb로 코드 흐름을 분석할 수 있습니다.

3.1 결합 예제

import logging

logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s - %(levelname)s - %(message)s')

def calculate(a, b):
    logging.info("계산 시작")
    result = a + b
    logging.debug(f"중간 결과: {result}")
    breakpoint()
    result *= 2
    logging.debug(f"최종 결과: {result}")
    return result

if __name__ == "__main__":
    logging.info("프로그램 시작")
    print(calculate(5, 7))

위 코드는 logging을 통해 로그를 남기면서, 중간중간 pdb로 멈춰서 변수 상태를 확인할 수 있습니다.


4. 정리

Python의 디버깅 도구인 pdblogging은 각각 강력한 기능을 제공하며, 함께 사용하면 더욱 효과적입니다. pdb로 코드를 단계적으로 분석하고, logging으로 실행 기록을 남기면서 문제를 체계적으로 파악하세요.

이 포스팅이 Python 디버깅 기술을 향상시키는 데 도움이 되었기를 바랍니다. 디버깅 과정에서 발생하는 다양한 상황에 맞게 pdblogging을 활용해 보세요!

728x90