수색…


Python 디버거 : _pdb_를 사용한 단계별 디버깅

Python 표준 라이브러리 에는 pdb 라는 대화식 디버깅 라이브러리가 포함되어 있습니다. pdb 에는 광범위한 기능이 있으며, 가장 일반적으로 사용되는 기능은 프로그램을 '단계별 실행'하는 기능입니다.

단계별 디버깅을 즉시 사용하려면 다음을 수행하십시오.

python -m pdb <my_file.py>

이렇게하면 프로그램의 첫 번째 행에서 디버거가 시작됩니다.

일반적으로 디버깅을 위해 코드의 특정 섹션을 타겟팅하는 것이 좋습니다. 이를 위해 우리는 pdb 라이브러리를 가져오고 set_trace () 를 사용하여이 문제가있는 예제 코드의 흐름을 중단합니다.

import pdb

def divide(a, b):
    pdb.set_trace()
    return a/b 
    # What's wrong with this? Hint: 2 != 3

print divide(1, 2)

이 프로그램을 실행하면 대화 형 디버거가 시작됩니다.

python foo.py 
> ~/scratch/foo.py(5)divide()
-> return a/b
(Pdb) 

종종이 명령은 한 줄에 사용되어 하나의 # 문자로 주석 처리 될 수 있습니다

 import pdf; pdb.set_trace()

(Pdb) 프롬프트에서 명령을 입력 할 수 있습니다. 이 명령은 디버거 명령 또는 파이썬 일 수 있습니다. 변수를 출력하기 위해 디버거에서 p 나 파이썬의 print를 사용할 수 있습니다.

(Pdb) p a
1
(Pdb) print a
1

모든 지역 변수 목록을 보려면 다음을 사용하십시오.

locals

빌드 인 기능

다음은 알 수있는 좋은 디버거 명령입니다.

b <n> | <f>: set breakpoint at line *n* or function named *f*.
# b 3
# b divide
b: show all breakpoints.
c: continue until the next breakpoint.
s: step through this line (will enter a function).
n: step over this line (jumps over a function).
r: continue until the current function returns.
l: list a window of code around this line.
p <var>: print variable named *var*.
# p x
q: quit debugger.
bt: print the traceback of the current execution call stack
up: move your scope up the function call stack to the caller of the current function
down: Move your scope back down the function call stack one level
step: Run the program until the next line of execution in the program, then return control back to the debugger
next: run the program until the next line of execution in the current function, then return control back to the debugger
return: run the program until the current function returns, then return control back to the debugger
continue: continue running the program until the next breakpoint (or set_trace si called again)

디버거는 또한 대화식으로 파이썬을 평가할 수 있습니다.

-> return a/b
(Pdb) p a+b
3
(Pdb) [ str(m) for m in [a,b]] 
['1', '2']
(Pdb) [ d for d in xrange(5)]
[0, 1, 2, 3, 4]

노트 :

변수 이름이 디버거 명령과 일치하면 느낌표 ' ! '변수를 명시 적으로 참조하고 디버거 명령을 나타내지는 않습니다. 예를 들어 카운터에 변수 이름 ' c '를 사용하면 디버거에서 인쇄하는 것이 좋습니다. 간단한 ' c '명령은 다음 중단 점까지 실행을 계속합니다. 대신 ' ! c '를 사용하여 다음과 같이 변수 값을 인쇄하십시오.

(Pdb) !c
4

IPython과 ipdb를 통해

IPython (또는 Jupyter )이 설치된 경우 다음을 사용하여 디버거를 호출 할 수 있습니다.

import ipdb
ipdb.set_trace()

도달하면 코드가 종료되고 인쇄됩니다.

 /home/usr/ook.py(3)<module>()
      1 import ipdb
      2 ipdb.set_trace()
----> 3 print("Hello world!")

ipdb>

분명히 이것은 코드를 편집해야한다는 것을 의미합니다. 더 간단한 방법이 있습니다.

from IPython.core import ultratb
sys.excepthook = ultratb.FormattedTB(mode='Verbose',
                                     color_scheme='Linux',
                                     call_pdb=1)

포착되지 않은 예외가 발생하면 디버거가 호출됩니다.

원격 디버거

어떤 때는 다른 프로세스에 의해 실행되는 파이썬 코드를 디버깅 할 필요가 있으며,이 경우 rpdb 가 도움이됩니다.

rpdb는 stdin 및 stdout을 소켓 처리기로 다시 라우팅하는 pdb 주위의 래퍼입니다. 기본적으로 포트 4444에서 디버거를 엽니 다.

용법:

# In the Python file you want to debug.
import rpdb
rpdb.set_trace()

그런 다음이 프로세스에 연결하려면 터미널에서 실행해야합니다.

# Call in a terminal to see the output
$ nc 127.0.0.1 4444

그리고 너는 pdb promt를 얻을 것이다.

> /home/usr/ook.py(3)<module>()
-> print("Hello world!")
(Pdb)


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow