2019.01.02

예제로 알아보는 파이썬 디버거 사용법

Serdar Yegulalp | InfoWorld
파이썬(Python) 프로그래밍 언어의 폭넓은 활용성과 유연성은 강력한 표준 라이브러리와 풍부한 서드파티 소프트웨어 생태계 덕분이다. 이를 통해 파이썬 프로그래머는 많은 유용한 툴을 사용할 수 있는데, 이런 장점은 디버깅 작업에서도 마찬가지다.



파이썬 프로그램을 디버깅하는 방법은 다양하다. 여러 파이썬 IDE의 디버그 기능을 이용하거나 서드파티 파이썬 디버거 또는 특수 목적용 툴을 써도 된다. 특히 인터랙티브 디버깅을 이용하면 언어를 바로 제어할 수 있다. 즉 파이썬 프로그램 내에서 일반적인 실행을 통해 인터랙티브 디버깅을 바로 호출하는 것이다.

여기서는 파이썬의 내장 인터랙티브 디버거인 pdb 사용법을 간단하게 살펴보자.

파이썬 디버거 예제
pdb 모듈은 파이썬 표준 라이브러리의 일부다. 따라서 별도로 설치할 필요가 없고 바로 호출해 사용할 수 있다. 다음은 간단한 pdb 사례다.

import pdb
x=0
while True:
    x+=1
    print ("Current number:", x)
    pdb.set_trace()


파이썬 3.7 버전 이후부터는 기존의 pdb.set_trace() 대신에 새로운 내장 기능인 breakpoint()를 사용할 수 있다. breakpoint()를 실행하면 pdb가 자동으로 호출한다.

x=0
while True:
    x+=1
    print ("Current number:", x)
    breakpoint()


이 예제를 실행해보면 화면에 Current number: 1이 나타난 후 (Pdb) 프롬프트로 넘어갈 것이다. 이 프롬프트는 디버거가 시작됐으며, 현재 스택 프레임 내에서 실행 명령을 기다리고 있다는 의미다.

파이썬 디버거 명령어
pdb에서 가장 널리 사용되는 명령어가 몇 가지 있다.

p/pp: Print expression 일부 표현식의 결과를 프린트한다. 여기서 살펴본 예제를 실행하고 첫 브레이크포인트에서 p x를 입력하면 이 시점의 값인 1이 화면에 나타난다.

c: Continue 사용자가 다른 브레이크포인트를 입력할 때까지 프로그램을 계속 실행한다. c를 입력한 후 다음 브레이크포인트에서 p x를 치면, 또다른 사이클을 돈 후의 x 값이 2가 화면에 나타날 것이다.

s: Step forward 프로그램의 한줄 앞으로 간다. pdb 프롬프트가 실행된 줄 다음에 나타날 것이다.

l: List source 실행 중에 특정 포인트에서 프로그램의 소스코드를 프린트한다. 프린트 포인트 중간에 현재 라인이 나타날 것이다. 

w: Print stack trace 특정 순간에서 프로그램의 전체 스택을 보여준다. 이를 이용하면 현재 모듈이 전체 실행 과정 중에서 어디에 있는지를 알 수 있다.

!: Execute statement : 느낌표를 앞에 붙이면 모든 유효한 파이썬 선언을 현재 실행중인 모듈과 함께 실행할 수 있다. 앞선 예제에서 pdb 프롬프트의 경우 x에 100을 설정하려면 !x=100이라고 쓰면 된다. 단, 표현식에서 공백이 없다는 데 주의하자. 파이썬에서 모든 공백은 들여쓰기로 인식된다.

pdb로 조건부 디버깅하기
단지 파이썬 선언 만으로 디버거를 호출할 수 있으므로 조건에 따라 디버거를 팝업으로 사용할 수도 있다. 예를 들어 if/then이나 try/excep 블록을 이용하는 식이다. 이는 특정 조건에서 발생하는 문제를 처리하는 매우 간편한 방법이다. 

조건부 디버깅을 하는 다른 방법도 있다. 파이썬 선언 값을 구하는 pdb.run() 명령을 이용하는 것이다. 혹은 파이썬 표현을 연산하는 pdb.runeval() 명령도 있다.

pdb.run('x+=1')
pdb.runeval('x==0')


이런 명령어를 실행하면 표현식이나 선언이 pdb 제어하에 연산하므로, 실행 과정에서 동적으로 표현식이나 선언을 수정할 수 있다. 또는 구체적으로 어떤 작업을 수행하는지 pdb를 통해 확인할 수도 있다. pdb에 대한 더 자세한 내용은 공식 파이썬 디버거 문서를 참고하면 된다. ciokr@idg.co.kr



2019.01.02

예제로 알아보는 파이썬 디버거 사용법

Serdar Yegulalp | InfoWorld
파이썬(Python) 프로그래밍 언어의 폭넓은 활용성과 유연성은 강력한 표준 라이브러리와 풍부한 서드파티 소프트웨어 생태계 덕분이다. 이를 통해 파이썬 프로그래머는 많은 유용한 툴을 사용할 수 있는데, 이런 장점은 디버깅 작업에서도 마찬가지다.



파이썬 프로그램을 디버깅하는 방법은 다양하다. 여러 파이썬 IDE의 디버그 기능을 이용하거나 서드파티 파이썬 디버거 또는 특수 목적용 툴을 써도 된다. 특히 인터랙티브 디버깅을 이용하면 언어를 바로 제어할 수 있다. 즉 파이썬 프로그램 내에서 일반적인 실행을 통해 인터랙티브 디버깅을 바로 호출하는 것이다.

여기서는 파이썬의 내장 인터랙티브 디버거인 pdb 사용법을 간단하게 살펴보자.

파이썬 디버거 예제
pdb 모듈은 파이썬 표준 라이브러리의 일부다. 따라서 별도로 설치할 필요가 없고 바로 호출해 사용할 수 있다. 다음은 간단한 pdb 사례다.

import pdb
x=0
while True:
    x+=1
    print ("Current number:", x)
    pdb.set_trace()


파이썬 3.7 버전 이후부터는 기존의 pdb.set_trace() 대신에 새로운 내장 기능인 breakpoint()를 사용할 수 있다. breakpoint()를 실행하면 pdb가 자동으로 호출한다.

x=0
while True:
    x+=1
    print ("Current number:", x)
    breakpoint()


이 예제를 실행해보면 화면에 Current number: 1이 나타난 후 (Pdb) 프롬프트로 넘어갈 것이다. 이 프롬프트는 디버거가 시작됐으며, 현재 스택 프레임 내에서 실행 명령을 기다리고 있다는 의미다.

파이썬 디버거 명령어
pdb에서 가장 널리 사용되는 명령어가 몇 가지 있다.

p/pp: Print expression 일부 표현식의 결과를 프린트한다. 여기서 살펴본 예제를 실행하고 첫 브레이크포인트에서 p x를 입력하면 이 시점의 값인 1이 화면에 나타난다.

c: Continue 사용자가 다른 브레이크포인트를 입력할 때까지 프로그램을 계속 실행한다. c를 입력한 후 다음 브레이크포인트에서 p x를 치면, 또다른 사이클을 돈 후의 x 값이 2가 화면에 나타날 것이다.

s: Step forward 프로그램의 한줄 앞으로 간다. pdb 프롬프트가 실행된 줄 다음에 나타날 것이다.

l: List source 실행 중에 특정 포인트에서 프로그램의 소스코드를 프린트한다. 프린트 포인트 중간에 현재 라인이 나타날 것이다. 

w: Print stack trace 특정 순간에서 프로그램의 전체 스택을 보여준다. 이를 이용하면 현재 모듈이 전체 실행 과정 중에서 어디에 있는지를 알 수 있다.

!: Execute statement : 느낌표를 앞에 붙이면 모든 유효한 파이썬 선언을 현재 실행중인 모듈과 함께 실행할 수 있다. 앞선 예제에서 pdb 프롬프트의 경우 x에 100을 설정하려면 !x=100이라고 쓰면 된다. 단, 표현식에서 공백이 없다는 데 주의하자. 파이썬에서 모든 공백은 들여쓰기로 인식된다.

pdb로 조건부 디버깅하기
단지 파이썬 선언 만으로 디버거를 호출할 수 있으므로 조건에 따라 디버거를 팝업으로 사용할 수도 있다. 예를 들어 if/then이나 try/excep 블록을 이용하는 식이다. 이는 특정 조건에서 발생하는 문제를 처리하는 매우 간편한 방법이다. 

조건부 디버깅을 하는 다른 방법도 있다. 파이썬 선언 값을 구하는 pdb.run() 명령을 이용하는 것이다. 혹은 파이썬 표현을 연산하는 pdb.runeval() 명령도 있다.

pdb.run('x+=1')
pdb.runeval('x==0')


이런 명령어를 실행하면 표현식이나 선언이 pdb 제어하에 연산하므로, 실행 과정에서 동적으로 표현식이나 선언을 수정할 수 있다. 또는 구체적으로 어떤 작업을 수행하는지 pdb를 통해 확인할 수도 있다. pdb에 대한 더 자세한 내용은 공식 파이썬 디버거 문서를 참고하면 된다. ciokr@idg.co.kr

X