pdb (Python DeBugger)는 Python 표준 라이브러리에 포함된 기본 디버거이고 ipdb (IPython DeBugger)는 pdb를 기반으로 IPython의 기능을 결합한 확장 디버거임.
Python 개발시 사용되는 도구로,
- 다음에 소개되는 명령들을 통해
- 코드를 한 줄씩 실행하거나
- 특정 위치에서 프로그램을 멈추고 디버깅할 수 있음.
CLI tool이므로, python의 기본 shell을 보강한 ipython의 관계처럼,
Syntax Highlighting이나, 셀명령어 실행, 자동완성 등의 기능을 보강한 ipdb가 보다 많이 사용됨 (별도 설치 필요.)
다음은 pdb
와 ipdb
의 주요 명령어들을 축약형과 함께 정리한 표임.
명령어 |
축약형 | 설명 | ipdb 전용 |
help | h | 사용 가능한 명령어 목록을 표시. | 아니오 |
list |
l |
현재 코드의 주위 11줄을 출력. | 아니오 |
next |
n |
Step Over . 다음 줄로 이동하여 실행. |
아니오 |
step |
s |
Step Into . 현재 줄에서 함수를 만나면 함수 내부로 진입하여 실행. |
아니오 |
continue |
c |
디버깅을 계속해서 종료 지점 또는 다음 브레이크포인트까지 실행. | 아니오 |
return |
r |
현재 함수의 끝까지 실행한 후 반환값에서 멈춤. | 아니오 |
break |
b |
특정 위치에 브레이크포인트를 설정. b [파일명:]line#[,조건] |
아니오 |
clear |
cl |
설정된 브레이크포인트 중 해당 번호의 브레이크포인트를 삭제. | 아니오 |
where |
w |
현재 디버깅 중인 스택 프레임 출력. | 아니오 |
quit |
q |
디버깅을 종료. | 아니오 |
print |
p |
변수 값을 출력. p varialble_name |
아니오 |
pp |
없음 | Pretty Print . 변수를 자세히 출력합니다. |
아니오 |
args |
없음 | 현재 함수의 arguments(인수) 값을 출력. | 아니오 |
jump |
j |
디버깅 지점을 특정 줄로 이동. | 아니오 |
up |
u |
상위 스택 프레임으로 이동. | 아니오 |
down |
d |
하위 스택 프레임으로 이동. | 아니오 |
restart |
run |
프로그램을 처음부터 다시 실행. | 아니오 |
pdef |
없음 | 함수 정의를 출력. | 예 |
pdoc |
없음 | 객체의 doc string(문서 문자열)을 출력. | 예 |
pinfo |
없음 | 객체의 정보와 메타데이터를 출력. | 예 |
pinfo2 |
없음 | 객체의 확장된 정보를 출력. | 예 |
source |
없음 | 함수의 소스 코드를 출력 (뒤에 함수명 붙일 것.) | 예 |
! |
없음 | ! 뒤에 오는 명령어를 셸에서 실행. |
예 |
- 설명 부분에서 square bracket으로 묶인 부분은 생략 가능함.
- vscode등에서 지원하는 debugging에서도 이 이상의 기능을 제공함.
그리고 그냥 Enter를 입력하면 이전 명령어가 반복됨.
Break Point 활용하기
디버깅에서 가장 많이 사용되는 방법은
- 의심되는 영역 등에 break point를 설정하고
- 각 statement별로 수행을 시켜보는 방법임.
pdb
또는 ipdb
에서는 다음과 같은 브레이크포인트를 설정하는 여러 방법을 지원함.
1. breakpoint()
함수 사용 (Python 3.7+)
Python 3.7 이상에서는 기본적으로 Break point설정을 위해 breakpoint()
함수를 제공함.
이 함수는 자동으로 기본 디버거(pdb
또는 환경변수 PYTHONBREAKPOINT
에 설정된 함수)를 사용.
def my_function():
x = 10
y = 20
breakpoint() # Python 3.7 이상에서 사용 가능
z = x + y
print(z)
my_function()
breakpoint()
는 기본적으로pdb.set_trace()
와 동일하게 동작함.- Python 자체에서 지원한다는 장점을 가짐.
export PYTHONBREAKPOINT=ipdb.set_trace
또는 set PYTHONBREAKPOINT=ipdb.set_trace
로 ipdb를 사용하도록 변경가능함.
환경변수 의 개념이 헷갈리면 다음 접은 글을 참고
2. code 에 브레이크포인트 직접 설정하는 set_trace
이전부터 기본적으로 제공하는 방법임.
실행 중 디버깅 세션이 시작되며, 해당 위치에서 코드가 멈춥니다.
import pdb # 또는 ipdb
def my_function():
x = 10
y = 20
pdb.set_trace() # 여기에 브레이크포인트 설정
z = x + y
print(z)
my_function()
pdb.set_trace()
또는ipdb.set_trace()
는 해당 라인에서 프로그램을 멈추고 디버깅 모드로 전환함.set_trace()
이후에는 디버거 명령어(next
,step
,continue
등)를 사용하여 디버깅을 진행이 가능.
3. Debugging Session 에서 브레이크포인트 설정 (break
명령어)
Debugging Session 중에 명령어를 사용하여 특정 라인 또는 함수에 브레이크포인트를 설정할 수 있음.
(Pdb) break <파일명>:<라인 번호>
(Pdb) break my_script.py:12 # my_script.py의 12번째 줄에 브레이크포인트 설정
break <파일명>:<라인 번호>
: 특정 파일의 라인 번호에 브레이크포인트를 설정.break <함수 이름>
: 특정 함수가 실행될 때 브레이크포인트를 설정.
예시:
(Pdb) break my_function # my_function 함수가 호출될 때 멈춤
4. Conditional Break Point
조건이 True
일 때만 브레이크포인트를 설정할 수 있음.
조건이 만족되지 않으면 해당 라인은 통과하고, 만족되면 실행이 멈춥니다.
(Pdb) break <파일명>:<라인 번호>, <조건>
(Pdb) break my_script.py:12, x == 10 # x가 10일 때만 12번째 줄에서 멈춤
예시:
(Pdb) break 12, x > 5 # x가 5보다 클 때만 12번째 줄에서 멈춤
5. Break Point 확인 및 삭제
Break Point 목록 확인:
(Pdb) break
이 명령어를 사용하면 설정된 모든 브레이크포인트를 볼 수 있음.
참고로 set_trace
등으로 지정된 것은 보이지 않음.
Break Point 삭제:
(Pdb) clear <브레이크포인트 번호>
특정 브레이크포인트를 삭제하려면 clear
명령을 사용합니다.
예시:
(Pdb) clear 1 # 첫 번째 브레이크포인트 삭제
6. Break Point 비활성화 (disable
) 및 활성화 (enable
)
Break point를 비활성화할 수 있으며, 필요할 때 다시 활성화할 수 있음.
(Pdb) disable <번호> # 브레이크포인트 비활성화
(Pdb) enable <번호> # 비활성화된 브레이크포인트 다시 활성화
예시:
(Pdb) disable 1 # 첫 번째 브레이크포인트 비활성화
(Pdb) enable 1 # 첫 번째 브레이크포인트 다시 활성화
Break Point 사용 요약
방법 | 설명 |
breakpoint() | Python 3.7+에서 기본 제공하는 함수로 브레이크포인트 설정 |
pdb.set_trace() 또는 ipdb.set_trace() |
코드에서 직접 브레이크포인트를 설정 |
break [파일명:]<라인 번호> |
디버깅 세션에서 특정 파일의 라인에 브레이크포인트 설정 |
break <함수 이름> |
특정 함수 호출 시 브레이크포인트 설정 |
break [파일명:]<라인 번호>, <조건> |
조건이 참일 때만 브레이크포인트 설정 |
clear <번호> |
설정된 브레이크포인트 삭제 |
disable <번호> / enable <번호> |
브레이크포인트 비활성화 및 활성화 |
'Python' 카테고리의 다른 글
[ML] Classic Regressor (Summary) (0) | 2024.10.02 |
---|---|
[Py] Debug: Error and Exception. (1) | 2024.09.25 |
[Py] assert 구문 (statement) (0) | 2024.09.24 |
[CV] cv2.calibrateCamera (1) | 2024.09.22 |
[Etc] SW Version: Semantic Versioning + package.version (0) | 2024.09.19 |