2011-09-30 6 views
9

저는 pdb로 직접 디버깅을하는 것이 매우 익숙하며 장고 응용 프로그램을 디버깅하는 데 문제가 있습니다. 여기에 내가하고있는 일이있다 :PDB가 중단 점에서 멈추지 않을 것입니다

python -m pdb manage.py runserver 
(pdb) b core/views.py:22 
Breakpoint 2 at /Users/raphaelcruzeiro/Documents/Projects/pdb_test/core/views.py:22 
(Pdb) c 

그러나 실행은 중단 점을 통해 직접 전달된다. 내가 명령을 놓치고 있니? 매뉴얼은 이것보다 더 이상 중단 점을 설정하는 방법을 자세히 설명하지 않습니다.

+0

예외는 아닙니다. 이 코드는 디버거가없는 경우처럼 실행됩니다. – Raphael

+0

오류 메시지가 아닌이 문제를 나타내는 작은 코드를 게시하십시오. –

답변

13

동일한 문제가 발생했습니다.

python -m pdb ./manage.py runserver --nothreading --noreload 127.0.0.1:8080과 같은 것을 시도해보십시오. 그것은 나를 위해이 문제를 해결했다.

PDB와의 중단 점은 스레드마다 다르며 PDB를 혼동시킬 수있는 분기를 방지하려면 --nothreading--noreload 옵션이 필요합니다. 이것은 set_trace이 작동하는 이유이기도합니다. 관심있는 스레드 내부에서 직접 호출되기 때문입니다.

+0

다른 모드에서이 작업을 수행하는 방법에 대한 아이디어가 있습니다 (특히, test)? - 서버가 실행되지 않는 것으로 보입니다. –

5

보통 원본 자체에 set_trace()을 선호합니다. 그러면 추가/제거시 dev 서버가 다시로드되고 다시 중지하거나 시작할 필요가 없습니다. . 예를 들어 사람이 아닌 줄에 중단 점을 설정했기 때문에보기에 액세스 할 때

def get_item(request): 
    import pdb; pdb.set_trace() 

, PDB가에서 시작된다

내가 과거에이 문제를 본 적이
+2

이 대안의 문제점은 소스 코드를 오염 시킨다는 것입니다. – Raphael

+0

그것은 의견의 문제입니다. 어쨌든, 디버그 중일뿐입니다. 물론 디버깅 세션이 끝나면이 명령문은 제거됩니다. (더하기, 소스 코드가 변경된 경우 명령 행을 갱신 할 필요가 없습니다. – mkriheli

+0

물론이 진술은 잊혀 질 것이라고 나는 믿는다. 내가 원하는 것은 pdb를 통해 간단한 중단 점을 설정하는 것이다. 이것은 어렵지 않으며 도구에 대한 더 많은 문서가 있어야합니다 ... – Raphael

1

, 보통이다 실제로 실행되는 Python 문에 연결됩니다. 예를 들어, 공백 행, 주석 행, 복수 행 명령문의 잘못된 부분.

1

내가 알아챈 한가지 이상한 점은 입력을 반복 할 때 PDB 프롬프트가 이전 작업을 반복한다는 것입니다. 또한 프로그램이 실행되는 동안 enter 키를 누르면 PDB가 입력을 버퍼링하고 프롬프트가 나타나면 입력을 적용합니다. 제 경우에는 PDB c (ontinue)를 사용하여 프로그램을 실행하고있었습니다. 내 프로그램은 초기화 동안 stdout에 디버그 정보를 많이 쓰고 있었기 때문에 몇 번 입력하면 이미 작성된 출력이 중단 점이 트리거되면 기록 될 출력과 분리됩니다. 그런 다음 일부 외부 동작을 통해 중단 점을 트리거하면 PDB는 중단 점에서 중단되지만 c (ontinue) 동작을 반복하는 '버퍼가있는 입력'을 적용합니다. 일단 타격을 멈 추면 모든 것이 정상적으로 작동하기 시작했습니다.

약간 이상하게 들리 겠지만이 문제를 많이 조사하지는 않았지만 문제가 해결되었습니다. 어쩌면 다른 사람을 도울 수 있습니다.

관련 문제