본문 바로가기
Python

[Py] Debugging: pdb and ipdb

by ds31x 2024. 9. 25.

pdb (Python DeBugger)는 Python 표준 라이브러리에 포함된 기본 디버거이고 ipdb (IPython DeBugger)는 pdb를 기반으로 IPython의 기능을 결합한 확장 디버거임.

 

Python 개발시 사용되는 도구로,

  • 다음에 소개되는 명령들을 통해
  • 코드를 한 줄씩 실행하거나
  • 특정 위치에서 프로그램을 멈추고 디버깅할 수 있음.

CLI tool이므로, python의 기본 shell을 보강한 ipython의 관계처럼,
Syntax Highlighting이나, 셀명령어 실행, 자동완성 등의 기능을 보강한 ipdb가 보다 많이 사용됨 (별도 설치 필요.)

 

다음은 pdbipdb의 주요 명령어들을 축약형과 함께 정리한 표임.

명령어 축약형 설명 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 <번호> 브레이크포인트 비활성화 및 활성화
728x90

'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