
pdb (Python DeBugger)는 Python 표준 라이브러리에 포함된 기본 디버거이고
ipdb (IPython DeBugger)는 pdb를 기반으로 IPython의 기능을 결합한 확장 디버거임.
참고로 debugpy 는 vscode에서 python debugging을 위해 제공되는 디버거임 (vscode에서 기본으로 사용)
Python 개발시 사용되는 도구로,
- 다음에 소개되는 명령들을 통해
- 코드를 한 줄씩 실행하거나
- 특정 위치에서 프로그램을 멈추고 디버깅할 수 있음.
pdb와 ipdb는 기본적으로 CLI tool임.
python의 기본 shell을 보강한 ipython의 관계처럼,
Syntax Highlighting이나, 셀명령어 실행, 자동완성 등의 기능을 보강한 ipdb가 보다 많이 사용됨 (별도 설치 필요.)
다음은 pdb와 ipdb의 주요 명령어들을 축약형과 함께 정리한 표임.
명령어 |
축약형 | 설명 | ipdb 전용 |
| help | h | 사용 가능한 명령어 목록을 표시. | 아니오 |
list |
l |
현재 코드의 주위 11줄을 출력. | 아니오 |
next |
n |
Step Over (F10). 다음 줄로 이동하여 실행. |
아니오 |
step |
s |
Step Into (F11). 현재 줄에서 함수를 만나면 함수 내부로 진입하여 실행. |
아니오 |
continue |
c |
(F5).디버깅을 계속해서 종료 지점 또는 다음 브레이크포인트까지 실행. | 아니오 |
return |
r |
현재 함수의 끝까지 실행한 후 반환값에서 멈춤. | 아니오 |
break |
b |
특정 위치에 브레이크포인트를 설정. b [파일명:]line#[,조건] |
아니오 |
clear |
cl |
설정된 브레이크포인트 중 해당 번호의 브레이크포인트를 삭제. | 아니오 |
where |
w |
현재 디버깅 중인 스택 프레임 출력. | 아니오 |
quit |
q |
디버깅을 종료. (vscode의 디버그에선 SHIFT+F5) | 아니오 |
print |
p |
변수 값을 출력. p varialble_name |
아니오 |
pp |
없음 | Pretty Print. 변수를 자세히 출력합니다. |
아니오 |
args |
없음 | 현재 함수의 arguments(인수) 값을 출력. | 아니오 |
jump |
j |
디버깅 지점을 특정 줄로 이동. | 아니오 |
up |
u |
상위 스택 프레임으로 이동. | 아니오 |
down |
d |
하위 스택 프레임으로 이동. | 아니오 |
restart |
run |
프로그램을 처음부터 다시 실행 (CTRL+SHIFT+F5). python -m pdb <main-script.py> 형식으로 실행한 경우만 제대로 동작 |
아니오 |
pdef |
없음 | 함수 정의를 출력. | 예 |
pdoc |
없음 | 객체의 doc string(문서 문자열)을 출력. | 예 |
pinfo |
없음 | 객체의 정보와 메타데이터를 출력. | 예 |
pinfo2 |
없음 | 객체의 확장된 정보를 출력. | 예 |
source |
없음 | 함수의 소스 코드를 출력 (뒤에 함수명 붙일 것.) | 예 |
! |
없음 | ! 뒤에 오는 명령어를 셸에서 실행. |
예 |
- 설명 부분에서 square bracket으로 묶인 부분은 생략 가능함.
- vscode등에서 지원하는 debugging에서도 이 이상의 기능을 제공함.
그리고 그냥 Enter를 입력하면 이전 명령어가 반복됨.
디버그 모드로 실행하기
- pdb.set_trace(), ipdb.set_trace() 또는 breakpoint() 를 소스코드에 명시적으로 추가한 경우엔 python으로 실행하면 해당 위치에서 멈추고 디버그 모드로 실행됨.
- 이 경우엔 restart는 수행되지 않음.
- 디버거가 “프로그램 실행 주체”가 아니기 때문에, 재시작을 처리할 run loop가 없음.
- 즉, 중간에 pdb (or ipdb)로 진입한 경우는 restart가 안 됨.
- 이들 함수를 사용하려면, import pdb 등이 이루어져야 함.
- 이 경우엔 restart는 수행되지 않음.
- 보통은 python -m pdb 로 pdb를 모듈로 실행하고 뒤의 추가적인 인자로 main script인 python 파일을 지정하는 방식을 더 많이 사용함.
- hello.py 가 메인스크립트 파일이라면,
- python -m pdb hello.py 임.
- ipdb를 쓰려면 pdb를 ipdb로만 바꾸면 됨.
참고:
python -m ipdb의 경우, 구조적으로 RuntimeWarning: 'ipdb.__main__' found in sys.modules ... 경고가 나올 수 있음: 동작에 이상없으니 무시해도 됨.
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
이 명령어를 사용하면 debugging session에서 설정된 모든 브레이크포인트를 볼 수 있음.
참고로 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 <번호> |
브레이크포인트 비활성화 및 활성화 |
같이 보면 좋은 자료들
2024.10.09 - [utils] - [vscode] Debug 사용법 요약: Python + launch.json :
[vscode] Debug 사용법 요약: Python + launch.json :
0. Debug 수행 중인 VSCode 화면 (Debug view) : VS code 에서 debug를 시작 하려면activity bar에서 “벌레와 플레이 모양의 icon” 를 클릭하고나오는 패널의 상단에 위치한 Run and Debug 버튼을 누르면,Debug Sidebar
ds31x.tistory.com
2024.09.25 - [Python] - [Py] Debug: Error and Exception.
[Py] Debug: Error and Exception.
1. ExceptionPython의 모든 (다룰 수 있는) 예외(Exception)의 상위 클래스.Exception: 영어로 “예외”, “특별한 경우”, 또는 “일반 규칙에서 벗어난 것”을 의미. Python 프로그램에서 예외(exception)는정상
ds31x.tistory.com
'Python' 카테고리의 다른 글
| [ML] Classic Regressor (Summary) - regression (0) | 2024.10.02 |
|---|---|
| [Py] Debug: Error and Exception. (1) | 2024.09.25 |
| [Py] assert 구문 (statement) (1) | 2024.09.24 |
| [CV] cv2.calibrateCamera (1) | 2024.09.22 |
| [Etc] SW Version: Semantic Versioning + packaging.version (0) | 2024.09.19 |