2009-10-26 4 views
10

subprocess.Popen을 사용하여 자식 프로세스를 만드는 코드를 디버깅하는 방법을 찾으려고 Eclipse/PyDev를 사용하고 있습니다. 생성 된 자식 프로세스를 디버그 할 수 있기를 원합니다. 문제는 프로세스 간 경계를 디버그 할 수있는 방법을 찾을 수 없다는 것이며, 실제로는 불가능하다는 것입니다. 아직도, 당신은 물어볼 때까지 결코 알지 못합니다.pydev를 사용하여 하위 프로세스를 디버깅하는 방법이 있습니까?

약간의 배경 : 복잡한 빌드 프로세스가 Waf에 의해 구동되며, 이는 필요한 경우 nose을 호출하여 단위 테스트를 호출합니다. 단위 테스트 오류를 ​​디버깅하기 위해 이러한 프로세스에 연결하고 싶습니다. 나는 코를 직접 작동 시키려고 노력할 수 있다는 것을 압니다. 그러나 문제는 제대로로드하기 위해 모듈을 구성해야하는 환경이 상당히 복잡하고 피할 수 있다면 코드를 복제하고 싶지 않다는 것입니다.

나는 remote debugging 모드를 알고 있지만 원격 프로세스에서 디버거를 수동으로 호출해야하기 때문에 꽤 불편합니다. 누구든지 내가하려는 일을하는 방법을 알고 있다면 많은 도움이 될 것입니다.

+0

이 질문과 답변은 꽤 오래되었지만 Raphael에서 현재 허용 된 대답 대신에 pimlottc의 답변을 수락하라고 제안하고 싶습니다. Raphael의 답변은 주어 졌을 때 올바른 대답 일지 모르지만 pimlottc의 대답은 절대적으로 정확하고 매우 유용합니다. – skrrgwasme

답변

4

나는 PyDev가 할 수있는 것처럼 보이지 않지만 (PyDbg와 WinDbg도 할 수 없다), gdb는 다음과 같이 보일 수있다 : http://wiki.python.org/moin/DebuggingWithGdb.

+0

포크를 따라 하위 프로세스로 이동하거나 수동으로 하위 프로세스에 연결하도록 제안 할 수 있습니까? GDB가 파이썬 스택을 검사 할 수 있다는 것을 배우는 것은 흥미 롭다 : 나는 그것을 모른다 : – jkp

+0

난 그냥 수동으로 프로세스에 연결하는 것이 좋습니다. –

+1

그런데 수동으로 부착해야한다는 제한은 실제로 Unix 시스템이 작동하는 방식의 결과이며 특정 언어 나 디버거에만 국한되지 않습니다. –

3

나는 당신을 위해 효과가있을 수있는 대안을 발견했습니다.

필자와 마찬가지로 원하는 중단 점에서 pydevd.settrace()에 수동으로 호출을 삽입하는 원격 디버깅 옵션을 찾았습니다. 그러나 이후의 PyDev 중단 점 (즉, 왼쪽 여백을 클릭하여 생성 된 중단 점)도 준수된다는 사실을 알게되었습니다. 따라서 프로세스에 대한 원격 디버깅 세션을 설정하기 위해 첫 번째 명시적인 settrace 호출이 필요하며 이후에는 일반 디버거 중단 점을 사용하는 것만으로 보인다.

또한, 실제로 공정을 중단하지 않도록 당신은 settrace 호출을 수정할 수 있습니다

import pydevd 
pydevd.settrace(suspend=False) 

그래서 어딘가 초기 서브 프로세스의 초기화에 위의 코드를 삽입하고 당신이 잘되어야합니다. 여전히 약간의 해킹이 있지만 수동 방법보다 확실히 좋습니다.

+1

subtreads에 적용 할 settrace에 대한 추가 플래그가 있지만 저를 위해 안정적으로 작동하지 않는 것 같습니다 : pydevd.settrace (suspend = False, trace_only_current_thread = False) – pimlottc

+0

PyDev 1.6.4부터 subthreads 추적이 작동합니다 나를 위해 좋은. pydev.settrace (...) 호출은 주 스레드에 위치합니다. –

관련 문제