2013-08-25 2 views
26

uWSGI에서 파이썬 pdb 디버거를 사용하려고 할 때 실행이 중단 점에서 중지되지 않고 트랙백 만 반환합니다. 나는 그것을 실행하는 방법uWSGI에서 파이썬 응용 프로그램을 디버깅하는 방법은 무엇입니까?

def application(env, start_response): 
    import pdb; pdb.set_trace() 
    start_response('200 OK', [('Content-Type','text/html')]) 
    return "Hello World" 

이것이다 : 여기

코드입니다

uwsgi --http 127.0.0.1:7777 --wsgi-file uwsgi_test.py 

이 내가 무엇을 얻을 수 있습니다 :

/home/andrey/Development/ttt/uwsgi_test.py(3)application() 
-> start_response('200 OK', [('Content-Type','text/html')]) 
(Pdb) 
Traceback (most recent call last): 
    File "uwsgi_test.py", line 3, in application 
    start_response('200 OK', [('Content-Type','text/html')]) 
    File "uwsgi_test.py", line 3, in application 
    start_response('200 OK', [('Content-Type','text/html')]) 
    File "/usr/lib/python2.7/bdb.py", line 48, in trace_dispatch 
    return self.dispatch_line(frame) 
    File "/usr/lib/python2.7/bdb.py", line 67, in dispatch_line 
    if self.quitting: raise BdbQuit 
bdb.BdbQuit 
[pid: 11421|app: 0|req: 1/1] 127.0.0.1() {32 vars in 366 bytes} [Sun Aug 25 13:12:06 2013] GET/=> generated 0 bytes in 63 msecs (HTTP/1.1 500) 0 headers in 0 bytes (0 switches on core 0) 
+0

수동으로 중단 점을 삽입 할 때'set_trace() '를 사용하는 대신) 디버깅을 시도한 적이 있습니까? –

+0

IDE가없는 간단한 텍스트 편집기에서 개발하고 있습니다. 그래서 제가 알고있는 유일한 선택은 중단 점입니다. – Anderson

+0

이 게시물을 확인하십시오 : http://stackoverflow.com/questions/6980749/simpler-way-to-put-pdb-breakpoints-in-python-code 좋은 IDE 외에도 정말 삶이 훨씬 쉬워 질 수 있습니다 (생산성 등을 높이는 데 도움이됩니다.) –

답변

47

이 uWSGI 닫히고 서버가되는 stdin (효과적으로/dev/null로 다시 매핑).

당신은 추가 (터미널 디버거를 필요로 할 때 같은) 표준 입력을해야하는 경우 :

--honour-stdin 
+3

Kinda는 아무 말도하지 않고 있지만, 다른 사람들이 이것을 깨닫지 못하는 경우를 대비하여 데몬 모드에서 uwsgi를 실행하고 있지 않은지 확인해야합니다. 그렇지 않으면 프로세스의 stdin/stdout까지 터미널을 연결해야합니다 (심지어 이것이 가능한가?). –

+0

이 팁을 가져 주셔서 감사합니다! –

-3

uwsgi --http 127.0.0.1:7777 --wsgi-file uwsgi_test.py --logto /path/to/log/log.txt 
+5

그건 디버깅이 아니며 적절한 파이썬 스택 트레이스를 제공하지도 않습니다. – jrwren

+0

질문에 대답하지 않지만이 코멘트는 도움이되었습니다. –

9

원격 디버거를 설치하려고합니다.

pip install remote-pdb 

응용 프로그램의 어딘가에 중단 점을 설정하십시오. 텔넷

당신은 가능성이 원격 디버거가 서로 밟지 않도록, 하나의 작업자/스레드와 uWSGI를 실행하는 것이 좋습니다
# Restart uwsgi to pick up changes 
... 

# Trigger the breakpoint, (any action to evaluate the set_trace call) 
... 

# Connect to debugger 
telnet 127.0.0.1 4444 

를 통해

from remote_pdb import RemotePdb 
RemotePdb('127.0.0.1', 4444).set_trace() 

연결 원격 디버거.

관련 문제