개요
가끔씩 프로그램을 디버깅해야 할 때가 있습니다. 이때 pdb
(Python Debugger)를 사용하면 프로그램의 실행 중에 중단점을 설정하고, 변수의 값을 검사하며, 스택 추적(traceback)을 확인할 수 있습니다. 이 글에서는 pdb
를 사용하여 Python 코드를 디버깅하는 방법에 대해 알아보겠습니다. 또한, Git과 pdb
를 결합하여 디버깅 정보를 저장하고 추적할 수 있는 방법에 대해서도 다룰 것입니다.
PDB 기본 사용법
1. 디버깅 시작하기
Python 스크립트를 디버깅 모드로 실행하려면 다음과 같이 해당 스크립트의 경로를 인자로 pdb
명령어와 함께 실행하면 됩니다.
python -m pdb my_script.py
2. 중단점 설정하기
디버깅 도중 특정 부분에서 프로그램을 중지하려면 중단점을 설정해야 합니다. pdb
에서는 break
혹은 b
명령어를 사용하여 중단점을 설정할 수 있습니다. 예를 들어, 파일의 10번째 줄에 중단점을 설정하려면 다음과 같이 입력합니다.
b 10
3. 실행 및 디버깅
중단점을 설정한 후에는 c
(continue) 명령어를 사용하여 프로그램을 실행하고 중단점에 도달할 때까지 진행할 수 있습니다. 중단점에서 프로그램이 멈추면 변수의 값을 확인하거나 스택 추적을 확인할 수 있습니다. 이때, n
(next) 명령어를 사용하여 다음 줄로 이동하거나 s
(step) 명령어를 사용하여 함수 내부로 진입할 수 있습니다.
4. 변수 값 확인하기
중단점에서 프로그램이 멈춘 상태에서 변수의 값을 확인하려면 해당 변수의 이름을 입력하면 됩니다. 예를 들어, x
라는 변수의 값을 확인하려면 다음과 같이 입력합니다.
p x
5. 스택 추적 확인하기
중단점이나 프로그램이 중지된 상태에서 스택 추적을 확인하려면 where
명령어를 사용합니다. 이를 통해 프로그램이 도달한 위치와 호출 스택을 확인할 수 있습니다.
Git과 PDB 통합
Git과 pdb
를 결합하면 디버깅 정보를 저장하고 추적할 수 있습니다. 디버깅 중에 발생하는 모든 중단점과 스택 추적 정보를 .gitignore
에 등록하여 Git으로 관리되는 디렉토리에 저장할 수 있습니다. 이를 위해 다음과 같이 .pdbrc
파일을 생성합니다.
# .pdbrc 파일 내용
import pdb
import os
def pdb_save(frame, event, arg):
if event == 'call':
frame.f_trace_lines = False
elif event == 'return':
frame.f_lineno += 1
if event in {'call', 'return'}:
filename = frame.f_globals['__file__']
if filename.endswith('.pyc'):
filename = filename[:-1]
basename = os.path.basename(filename)
pdb_commands = [
'source .gitignore', # Git으로 관리되는 디렉토리에 저장하기 위해 .gitignore, .git 디렉토리 무시
'up',
'print()',
f'!git add {filename}',
f'!git commit -m "pdb: {basename}:{frame.f_lineno}"',
'continue'
]
pdb_commands = '\n'.join(pdb_commands)
pdb_commands_bytes = pdb_commands.encode()
return pdb_commands_bytes
pdb.set_trace = pdb_save
.pdbrc
파일을 생성한 후, 해당 파일을 코드가 있는 디렉토리로 복사합니다. 그리고 다음과 같이 pdb
를 실행합니다.
python -m pdb my_script.py
이제 pdb
를 사용하여 디버깅하면 중단점에 도달할 때마다 Git으로 변경 사항이 저장되고 커밋됩니다.
결론
이제 Python 코드를 디버깅하기 위해 pdb
를 사용하는 기본적인 방법을 알아보았습니다. 또한, Git과 pdb
를 통합하여 디버깅 정보를 저장하고 추적할 수 있는 방법에 대해서도 배웠습니다. 이러한 도구를 적절히 활용하면 코드 디버깅 과정을 보다 효과적으로 수행할 수 있을 것입니다.
다음 글에서는 pdb
를 사용하여 좀 더 복잡한 디버깅 시나리오를 다루어볼 예정입니다. 기대해주세요!