본문 바로가기
IT/파이썬 기초 완전 정복

파이썬 디버깅 기법 (27)

by 지식 발전소 2024. 4. 22.
728x90
반응형

1

print 문 활용하기

안녕하세요. 이번에는 파이썬 디버깅 기법 중 가장 기본적인 print 문 활용하기에 대해 알아보겠습니다. 코드를 디버깅할 때 print 문을 적절히 활용하면 코드의 실행 흐름과 변수 값을 추적할 수 있어 버그를 쉽게 찾을 수 있습니다.

print 문 활용의 장점은 다음과 같습니다.

  1. 간단하고 직관적: print 문은 파이썬의 기본 기능이므로 아무런 추가 설정 없이 바로 사용할 수 있습니다.
  2. 코드 실행 흐름 추적 가능: 코드 중간에 print 문을 삽입하면 어디까지 실행되었는지 확인할 수 있습니다.
  3. 변수 값 확인 용이: 변수 값을 출력해 현재 상태를 쉽게 파악할 수 있습니다.

print 문 활용 예시를 봅시다. 아래 코드에서 각 print 문의 역할을 살펴보겠습니다.

def calculate_area(radius):
    print(f"calculate_area 함수 시작, radius = {radius}") # 1
    if radius < 0:
        print("반지름이 음수입니다.") # 2
        return 0
    area = 3.14 * radius ** 2
    print(f"원의 면적: {area}") # 3
    return area

radius = 5
area = calculate_area(radius)
print(f"최종 면적: {area}") # 4
  1. 함수 시작 지점과 인자 값을 확인합니다.
  2. 조건문 분기를 추적합니다.
  3. 계산 결과를 확인합니다.
  4. 최종 결과 값을 확인합니다.

print 문 활용 시 주의사항

  • 너무 많은 print 문을 남기면 코드가 지저분해집니다. 필요한 곳에만 잠시 삽입했다가 제거하는 것이 좋습니다.
  • 디버깅이 완료되면 print 문을 모두 제거해야 합니다. 운영 코드에 포함되어 있으면 성능 저하와 로그 파일 혼잡을 유발할 수 있습니다.

print 문은 간단하지만 효과적인 디버깅 도구입니다. 코드 실행 흐름을 파악하고 변수 값을 확인할 때 유용하게 활용할 수 있습니다. 다만 코드 가독성을 해치지 않도록 적절히 사용해야 합니다.

logging 모듈 활용하기

print 문은 간단하고 직관적이지만 운영 환경에서 사용하기에는 적합하지 않습니다. 이럴 때 logging 모듈을 활용하면 좋습니다. logging 모듈은 파이썬 표준 라이브러리에 포함된 디버깅 도구로, 로그 메시지를 원하는 방식으로 기록할 수 있습니다.

logging 모듈의 장점은 다음과 같습니다.

  1. 로그 레벨 관리 가능: 로그 메시지의 중요도에 따라 레벨을 설정할 수 있습니다.
  2. 로그 형식 지정 가능: 로그 메시지의 형식을 원하는 대로 설정할 수 있습니다.
  3. 로그 핸들러 사용 가능: 로그를 파일, 콘솔, 네트워크 등 다양한 방식으로 출력할 수 있습니다.

logging 모듈 사용 예시를 봅시다.

import logging

# 로거 인스턴스 생성
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)  # 로그 레벨 설정

# 콘솔 핸들러 설정
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)  # 핸들러 로그 레벨 설정
console_formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
console_handler.setFormatter(console_formatter)
logger.addHandler(console_handler)

# 함수 내부에서 로그 메시지 출력
def calculate_area(radius):
    logger.debug(f"calculate_area 함수 시작, radius = {radius}")
    if radius < 0:
        logger.warning("반지름이 음수입니다.")
        return 0
    area = 3.14 * radius ** 2
    logger.info(f"원의 면적: {area}")
    return area

radius = 5
area = calculate_area(radius)
logger.info(f"최종 면적: {area}")

이 코드에서는 logging 모듈을 이용해 다음과 같은 작업을 수행합니다.

  1. 로거 인스턴스를 생성하고 로그 레벨을 DEBUG로 설정합니다.
  2. 콘솔에 로그를 출력하기 위한 핸들러를 설정합니다.
  3. 함수 내부에서 로그 메시지를 출력합니다. 로그 레벨에 따라 debug, warning, info 메서드를 사용합니다.

logging 모듈을 사용하면 로그 메시지에 시간, 로거 이름, 로그 레벨 등의 정보가 포함되어 디버깅에 도움이 됩니다. 또한 로그 파일에 기록하거나 원격 로그 서버로 전송하는 등 다양한 옵션을 제공합니다.

logging 모듈 사용 시 주의사항

  • logging 모듈 설정을 프로그램 시작 부분에서 한 번만 하는 것이 좋습니다.
  • 로그 레벨을 적절히 설정하여 불필요한 메시지가 과도하게 출력되지 않도록 합니다.
  • 로그 메시지는 가독성 있게 작성하여 디버깅에 도움이 되도록 합니다.

logging 모듈은 프로덕션 환경에서 디버깅하기에 적합한 도구입니다. 로그 레벨과 핸들러를 설정하여 원하는 방식으로 로그를 기록할 수 있습니다. 또한 로그 분석 도구와 연계하여 유용한 정보를 얻을 수 있습니다.

pdb 모듈 활용하기

파이썬에 내장된 pdb 모듈은 강력한 디버깅 도구입니다. pdb는 Python Debugger의 약자로, 코드를 한 줄씩 실행하며 변수 값과 실행 흐름을 추적할 수 있습니다.

pdb 모듈의 장점은 다음과 같습니다.

  1. 코드 단계 실행 가능: 한 줄씩 코드를 실행하며 변수와 상태를 확인할 수 있습니다.
  2. 브레이크포인트 설정 가능: 특정 위치에서 코드 실행을 일시 중지할 수 있습니다.
  3. 대화형 디버깅 환경 제공: pdb 셸에서 코드를 직접 실행하고 변수를 조작할 수 있습니다.

pdb 모듈 사용 예시를 봅시다.

import pdb

def calculate_area(radius):
    pdb.set_trace()  # 브레이크포인트 설정
    if radius < 0:
        return 0
    area = 3.14 * radius ** 2
    return area

radius = 5
area = calculate_area(radius)
print(f"최종 면적: {area}")

이 코드에서 pdb.set_trace()는 브레이크포인트를 설정합니다. 실행 시 pdb 셸이 열리고 다음과 같은 명령어를 사용할 수 있습니다.

  • n (next): 현재 줄을 실행하고 다음 줄로 이동합니다.
  • s (step): 함수 내부로 step into합니다.
  • c (continue): 현재 위치에서 다음 브레이크포인트까지 계속 실행합니다.
  • p (print): 변수 값을 출력합니다. (p radius 형태로 사용)
  • l (list): 현재 위치의 코드를 출력합니다.
  • q (quit): pdb 셸을 종료합니다.

pdb 셸에서 이러한 명령어를 사용하면서 코드를 한 줄씩 실행하고 변수 값을 확인할 수 있습니다. 따라서 버그가 발생한 지점을 정확히 찾아낼 수 있습니다.

pdb 모듈 활용 시 주의사항

  • 브레이크포인트를 적절한 위치에 설정해야 합니다. 불필요한 곳에 설정하면 시간이 많이 소요될 수 있습니다.
  • 대화형 디버깅 환경에서 변수 값을 변경하면 프로그램 상태가 달라질 수 있으므로 주의해야 합니다.
  • pdb는 CLI 환경에서 사용하기 적합합니다. GUI 환경에서는 IDE의 디버거를 사용하는 것이 더 편리할 수 있습니다.

pdb 모듈은 파이썬 코드를 단계별로 실행하면서 변수와 상태를 추적할 수 있는 강력한 도구입니다. 특히 복잡한 로직이나 예외 상황에서 버그를 찾을 때 유용합니다. 다만 CLI 환경에서 사용해야 하므로 GUI 환경에서는 IDE의 디버거를 사용하는 것이 더 편리할 수 있습니다.

IDE 디버거 활용하기

대부분의 IDE(통합 개발 환경)에는 디버거 기능이 내장되어 있습니다. IDE 디버거를 활용하면 코드를 단계별로 실행하고 변수 값을 시각적으로 확인할 수 있어 디버깅이 편리해집니다.

IDE 디버거의 장점은 다음과 같습니다.

  1. GUI 기반 디버깅 환경 제공: 코드와 변수 값을 한눈에 볼 수 있습니다.
  2. 브레이크포인트 관리 용이: 브레이크포인트 설정, 제거, 조건부 브레이크포인트 등의 기능을 제공합니다.
  3. 디버깅 정보 시각화: 콜 스택, 변수 값, 스레드 등의 정보를 시각적으로 제공합니다.

대표적인 IDE인 PyCharm의 디버거 사용 예시를 살펴보겠습니다.

  1. 디버깅할 코드에 브레이크포인트를 설정합니다.
  2. 디버그 모드로 실행합니다. (Run > Debug 또는 키보드 단축기 사용)
  3. 코드가 브레이크포인트에서 중지되면 다음과 같은 작업을 수행할 수 있습니다.
    • 한 줄씩 코드 실행 (Step Into, Step Over 등)
    • 변수 값 확인
    • 디버깅 콘솔에서 표현식 평가
    • 콜 스택 탐색
    • 스레드 정보 확인

이렇게 PyCharm의 디버거를 사용하면 코드와 변수 값을 직관적으로 확인할 수 있어 디버깅이 쉬워집니다. 또한 디버거는 PyCharm 외에도 Visual Studio Code, Spyder, Eclipse 등 다양한 IDE에서 제공됩니다.

IDE 디버거 사용 시 주의사항

  • 디버거 사용법을 익히는 데 시간이 걸릴 수 있습니다. 꾸준히 연습하면 디버깅 속도가 빨라집니다.
  • 대규모 프로젝트에서는 디버거 사용 시 응답 속도가 느려질 수 있습니다.
  • 디버거를 잘못 사용하면 프로그램의 실행 흐름이 방해받을 수 있습니다.

IDE 디버거는 GUI 환경에서 편리하게 디버깅할 수 있는 훌륭한 도구입니다. 코드와 변수 값을 시각적으로 확인할 수 있어 버그를 효과물론입니다. 계속해서 IDE 디버거 활용에 대해 자세히 설명드리겠습니다.

브레이크포인트 관리

IDE 디버거의 핵심 기능 중 하나는 브레이크포인트 관리입니다. 브레이크포인트를 설정하면 코드 실행이 해당 지점에서 일시 중지되므로 그 시점의 변수 값과 상태를 확인할 수 있습니다. 대부분의 IDE에서는 다음과 같은 브레이크포인트 기능을 제공합니다.

  • 브레이크포인트 설정/제거: 코드 편집기에서 원하는 줄에 브레이크포인트를 설정하거나 제거할 수 있습니다.
  • 조건부 브레이크포인트: 특정 조건이 만족될 때만 브레이크포인트에서 중지되도록 설정할 수 있습니다. 예를 들어 if x > 10 조건을 지정할 수 있습니다.
  • 일시적 브레이크포인트: 한 번만 동작하는 브레이크포인트를 설정할 수 있습니다.
  • 함수 브레이크포인트: 특정 함수가 호출될 때 중지되도록 설정할 수 있습니다.

이렇게 다양한 브레이크포인트 기능을 활용하면 특정 상황에서만 코드를 중지시켜 디버깅할 수 있으므로 효율성이 높아집니다.

변수 값 추적

IDE 디버거에서는 디버깅 중 변수 값을 실시간으로 확인할 수 있습니다. 변수 창에서 모든 변수와 그 값을 볼 수 있고, 특정 변수를 강조 표시하여 값 변화를 쉽게 추적할 수도 있습니다. 또한 일부 IDE에서는 변수 값을 시각적으로 표현하는 기능도 제공합니다.

디버깅 정보 시각화

IDE 디버거는 디버깅에 유용한 다양한 정보를 시각적으로 제공합니다.

  • 콜 스택 (Call Stack): 현재 실행 중인 함수 호출 스택을 확인할 수 있습니다. 이를 통해 코드 실행 흐름을 파악할 수 있습니다.
  • 스레드 (Threads): 멀티스레드 프로그램에서 각 스레드의 상태와 스택 정보를 볼 수 있습니다.
  • 웧치 (Watch): 특정 표현식의 값을 관찰할 수 있습니다. 복잡한 계산식이나 객체의 속성 값 등을 추적하는 데 유용합니다.
  • 디버깅 콘솔: 코드를 직접 실행하거나 표현식을 평가할 수 있는 대화형 콘솔을 제공합니다.

이러한 다양한 정보를 시각화하여 제공하므로 복잡한 코드나 예외 상황에서도 디버깅이 수월해집니다.

주요 IDE 디버거 소개

  • PyCharm: 파이썬 전용 IDE로, 강력한 디버거를 제공합니다. 브레이크포인트 관리, 변수 추적, 디버깅 정보 시각화 등의 기능이 탁월합니다.
  • Visual Studio Code: 경량화된 IDE이지만 디버거 기능이 우수합니다. 브레이크포인트, 변수 값 확인, 콜 스택 탐색 등의 기능을 제공합니다.
  • Spyder: 과학 컴퓨팅 및 데이터 분석 분야에서 많이 사용되는 IDE로, NumPy, SciPy, Pandas 등의 라이브러리에 최적화된 디버거를 지원합니다.

대부분의 IDE 디버거는 유사한 기능을 제공하지만, 특정 분야나 프로젝트의 성격에 따라 더 적합한 IDE가 있을 수 있습니다. 자신의 개발 환경과 요구 사항에 맞는 IDE 디버거를 선택하는 것이 좋습니다.

디버거 사용 팁

IDE 디버거를 효과적으로 활용하려면 다음과 같은 팁을 참고하세요.

  1. 브레이크포인트를 적절히 설정: 불필요한 곳에 브레이크포인트를 설정하면 디버깅 속도가 느려질 수 있습니다. 중요한 지점이나 예외 상황에서만 브레이크포인트를 설정하세요.
  2. 변수 값 추적에 주력: 변수 값의 변화를 주시하면서 코드 실행 흐름을 파악하는 것이 중요합니다.
  3. 콜 스택과 스레드 정보 활용: 이를 통해 코드 실행 경로와 병렬 실행 상황을 파악할 수 있습니다.
  4. 디버깅 콘솔 활용: 콘솔에서 직접 표현식을 평가하거나 코드를 실행해 보면 이해도가 높아집니다.
  5. 단축키 활용: 대부분의 IDE 디버거는 단축키를 제공하므로 이를 익혀 사용하면 효율성이 높아집니다.
  6. 디버거 학습에 시간 투자: 처음에는 디버거 사용법을 익히는 데 시간이 걸릴 수 있지만, 꾸준히 연습하면 디버깅 속도가 빨라집니다.

IDE 디버거는 파이썬 개발 시 매우 유용한 도구입니다. 코드와 변수 값을 시각적으로 확인할 수 있어 버그를 효과적으로 찾아낼 수 있습니다. 또한 다양한 정보를 제공하므로 복잡한 코드도 쉽게 디버깅할 수 있습니다. 적절한 IDE와 디버거를 선택하고 사용법을 익혀 활용한다면 개발 생산성이 크게 향상될 것입니다.

파이썬 프로파일러 활용하기

파이썬 프로파일러(profiler)는 코드의 실행 시간과 메모리 사용량을 측정하여 성능 병목 지점을 찾는 데 도움을 줍니다. 프로파일링은 디버깅과 다르지만, 프로그램의 최적화와 성능 개선에 필수적입니다.

프로파일러의 장점은 다음과 같습니다.

  1. 코드 실행 시간 측정: 각 함수나 코드 블록의 실행 시간을 측정할 수 있습니다.
  2. 메모리 사용량 추적: 메모리 누수나 과도한 메모리 사용 지점을 찾을 수 있습니다.
  3. 병목 지점 식별: 프로그램의 병목이 되는 코드 부분을 쉽게 파악할 수 있습니다.

cProfile 모듈 사용 예시

파이썬 표준 라이브러리에 포함된 cProfile 모듈은 프로파일링 기능을 제공합니다. 아래는 cProfile을 사용하여 실행 시간을 측정하는 예시입니다.

import cProfile

def calculate_sum(n):
    total = 0
    for i in range(n):
        total += i
    return total

cProfile.run('calculate_sum(10000000)')

이 코드를 실행하면 다음과 같은 출력을 볼 수 있습니다.

         4 function calls in 0.000 seconds

   Ordered by: standard unit

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.000    0.000 <string>:1(<module>)
        1    0.000    0.000    0.000    0.000 {built-in method builtins.exec}
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}
        1    0.000    0.000    0.000    0.000 profiling.py:15(calculate_sum)

이 출력에서 tottime은 해당 함수에서 실제로 소비된 시간이고, cumtime은 해당 함수와 그 안에서 호출된 함수들의 전체 실행 시간입니다.

memory_profiler 라이브러리 사용 예시

메모리 사용량을 측정하려면 memory_profiler 라이브러리를 사용할 수 있습니다. 이 라이브러리는 파이썬 표준 라이브러리에 포함되어 있지 않으므로 별도로 설치해야 합니다.

from memory_profiler import profile

@profile
def calculate_sum(n):
    total = 0
    for i in range(n):
        total += i
    return total

calculate_sum(10000000)

이 코드를 실행하면 메모리 사용량에 대한 정보가 출력됩니다.

Filename: profiling.py

Line #    Mem usage    Increment   Line Contents
================================================
    15     13.6 MiB      0.0 MiB   @profile
    16                             def calculate_sum(n):
    17     13.6 MiB      0.0 MiB       total = 0
    18     45.1 MiB     31.5 MiB       for i in range(n):
    19     45.1 MiB      0.0 MiB           total += i
    20     13.6 MiB    -31.5 MiB       return total

이 출력에서 Increment 열은 해당 줄에서 추가로 사용된 메모리 양을 보여줍니다.

프로파일러 활용 시 주의사항

  • 프로파일링은 실제 프로덕션 환경에서 수행하는 것이 좋습니다. 개발 환경에서는 성능 문제가 발생하지 않을 수 있습니다.
  • 프로파일링 결과를 해석할 때는 주의해야 합니다. 단순히 실행 시간이나 메모리 사용량이 높다고 해서 항상 병목 지점이 되는 것은 아닙니다.
  • 프로파일링으로 인해 프로그램의 실행 속도가 느려질 수 있습니다. 따라서 필요한 경우에만 프로파일링을 수행하는 것이 좋습니다.

프로파일러는 코드의 성능 문제를 찾고 최적화하는 데 매우 유용한 도구입니다. 실행 시간과 메모리 사용량을 측정하여 병목 지점을 식별할 수 있습니다. 그러나 프로파일링 결과를 올바르게 해석하고 적절한 최적화 방법을 선택하는 것이 중요합니다. 프로파일러를 효과적으로 활용하면 프로그램의 성능을 크게 향상시킬 수 있습니다.

참고 자료

  1. 파이썬 공식 문서 - Debugging
  2. 파이썬 공식 문서 - Profilers
  3. 파이썬 공식 문서 - The Python Debugger
  4. 파이썬 공식 문서 - Logging Facility for Python
  5. Real Python - Python Debugging With Pdb: The Basic Commands
  6. Real Python - Logging in Python
  7. PyCharm 공식 문서 - Debugging in PyCharm
  8. Python Memory Profiler - memory_profiler

 

 

한 고대 문서 이야기

여기 한 고대 문서가 있습니다. 이 문서는 B.C. 1,500년 부터 A.D 100년까지 약 1,600 여 년 동안 기록되었습니다. 이 문서의 저자는 약 40 명입니다. 이 문서의 고대 사본은 25,000 개가 넘으나, 사본간 오

gospel79.tistory.com

 

유튜브 프리미엄 월 1만원 할인받고 월 4000원에 이용하는 방법

올해 5월부터 월 8000원 정도이던 유튜브 프리미엄 요금이 15000원 정도로 인상됩니다. 각종 OTT 서비스, ChatGPT 같은 서비스들이 늘어나다보니 이런 거 몇 개만 이용하더라도 월 이용요금이 5만원을

stock79.tistory.com

 

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."

728x90
반응형

이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

댓글