PDB가 실행 사이에 소스가 변경되었음을 인식하게하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/724924

  •  05-09-2019
  •  | 
  •  

문제

내가 알 수있는 것에서, PDB는 소스 코드가 "runs"사이에 변경되었는지 인식하지 못합니다. 즉, 디버깅하는 경우 버그를 확인하고 해당 버그를 수정 한 후 PDB (예 : PDB를 종료하지 않고)로 프로그램을 다시 실행하면 PDB는 코드를 다시 컴파일하지 않습니다. PDB가 새 소스 코드를 나열하더라도 이전 버전의 코드를 디버깅 할 것입니다.

그렇다면 소스가 변경 될 때 PDB가 컴파일 된 코드를 업데이트하지 않습니까? 그렇지 않다면 그렇게 할 수있는 방법이 있습니까? 내 브레이크 포인트 등을 유지하기 위해 단일 PDB 세션을 유지하고 싶습니다.

FWIW, GDB는 프로그램이 해당 프로그램의 재시작에만 디버깅을 변경하는 시점을 알게됩니다. 이것이 PDB에서 복제하려는 동작입니다.

도움이 되었습니까?

해결책

"PDB에서 프로그램을 다시 실행 하시겠습니까?"라는 의미는 무엇을 의미합니까? 모듈을 가져온 경우 모듈을 명시 적으로 요구하지 않는 한 Python은 다시 읽지 않습니다. reload(module). 하지만, reload 방탄과는 거리가 멀다 (참조 xreload 다른 전략).

파이썬 코드 재 장전에는 많은 함정이 있습니다. 문제를보다 강력하게 해결하려면 예를 들어 브레이크 포인트 정보를 디스크의 파일에 녹음하는 클래스로 PDB를 랩핑하여 명령으로 다시 재생할 수 있습니다.

(죄송합니다.이 답변의 첫 번째 버전을 무시하십시오. 이른 일이어서 질문을주의 깊게 읽지 않았습니다.)

다른 팁

다음 미니 모듈이 도움이 될 수 있습니다. PDB 세션에서 가져 오면 다음을 사용할 수 있습니다.

pdb> pdbs.r()

언제라도 모든 비 시스템 모듈을 제외한 모든 비 시스템 모듈을 강제로로드합니다 기본. 코드는 수입업자를 던지기 때문에 건너 뜁니다 ( '내부 모듈을 다시 시작할 수 없습니다. 기본') 예외.

# pdbs.py - PDB support

from __future__ import print_function

def r():
    """Reload all non-system modules, so a pdb restart
    will reload anything new
    """
    import sys
    # This is likely to be OS-specific
    SYS_PREFIX = '/usr/lib'

    for k, v in sys.modules.items():
        if not hasattr(v, '__file__'):
            continue
        if v.__file__.startswith(SYS_PREFIX):
            continue
        if k == '__main__':
            continue
        print('reloading %s [%s]' % (k, v.__file__))
        reload(v)

IPDB %autoreload 확대

6.2.0 문서 문서 http://ipython.readthedocs.io/en/stable/config/extensions/autoreload.html#module-ipython.extensions.autoreload :

In [1]: %load_ext autoreload

In [2]: %autoreload 2

In [3]: from foo import some_function

In [4]: some_function()
Out[4]: 42

In [5]: # open foo.py in an editor and change some_function to return 43

In [6]: some_function()
Out[6]: 43
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top