2016-08-11 11 views
16

ddd -pydb prog.py을 사용하여 파이썬 코드를 디버깅 할 수 있습니다. 파이썬 명령 줄 인수는 모두 prog.py 뒤에 전달 될 수 있습니다. 필자의 경우, 많은 클래스가 C++로 구현되어 있는데, 이들은 boost-python을 사용하여 파이썬에 노출되어있다. 나는 파이썬 코드와 C++를 함께 디버깅 할 수 있었으면 좋겠다. 예를 들어, 나는 다음과 같이 브레이크 포인트를 설정하려면 : 물론디버깅 Python과 C++가 함께 부스트 됨

break my_python.py:123 
break my_cpp.cpp:456 
cont 

나는 디버그 옵션을 사용하여 C++ 코드를 컴파일 한 후 그것을 시도하고 있지만, 디버거 크로스 부스트 경계를하지 않습니다. 어떤 방법이 있습니까?

편집 : 나는 http://www.boost.org/doc/libs/1_61_0/libs/python/doc/html/faq/how_do_i_debug_my_python_extensi.html을 보았습니다. 나는 그것을 따라 파이썬과 C++ 모두를 디버깅 할 수있다. 하지만 나는 바람직하게는 시각적 인 디버깅을 DDD으로하고 싶지만 DDD 안에 'target exec python'명령을주는 법을 모르겠습니다. 링크가 아니라면 (단지 gdb을 링크로 사용) 파이썬 스크립트를 디버깅 할 수 있어야합니다. 링크에서 대화식으로 파이썬 명령을 제공하지 않아야합니다.

+0

정확하게 대답은 아니지만 몇 가지 아이디어를 제공 할 수 있습니다. http://www.brendangregg.com/blog/2016-08-09/gdb-example-ncurses.html –

답변

7

파이썬을 실행하는 동안 C++ 부분을 디버깅하는 방법을 찾았습니다. (Python 책에서 프로세스 ID 탐지에 대해 읽는 동안 그것을 깨달았다.).
먼저 C++ 프로그램이 포함 된 Python 프로그램을 실행합니다. 파이썬 프로그램을 시작할 때 raw_input()을 사용하여 프로그램이 입력을 기다리게하십시오. 하지만 그 전에는 print os.getpid() (물론 os 패키지를 가져와야합니다)을 수행하십시오. 파이썬 프로그램을 실행하면 실행중인 파이썬 프로그램의 pid가 인쇄되어 키보드 입력을 기다리게됩니다.

파이썬 중지 코드 :

import os 

def w1(str): 
    print (str) 
    wait = raw_input() 
    return 

print os.getpid() 
w1('starting main..press a key') 

결과 :.

27352 
starting main..press a key 

또는 아래 코멘트 (감사 @AndyG) 등의 수입 PDB, pdb.set_trace()를 사용하여 편집을 볼 수 있습니다 * ps -aux을 사용하여 pid를 얻으십시오.

이제 C++ 공유 라이브러리가 _caffe.so 인 경우 (이 경우 _caffe.so 라이브러리에는 모든 C++ 코드가 있으며 파이썬 래퍼 기능이 향상됩니다). 27352는 PID입니다. 당신이 DDD처럼 사용하여 그래픽 디버깅을 사용하려면 다음

gdb caffe-fast-rcnn/python/caffe/_caffe.so 27352 

같은 다른 쉘 시작 GDB 나,

ddd caffe-fast-rcnn/python/caffe/_caffe.so 27352 

이 그럼 당신은 gdb를 시작보고 프롬프트를 기다릴 것이다 않습니다. 파이썬 프로그램은 gdb에 의해 인터럽트되고 정지 모드에서 기다린다. (키 입력을 기다리고 있었지만 실제로는 멈춤 모드이다. 그리고 대기중인 키를 계속 진행하기 위해 두 번째 디버거에서 gdb continue 명령이 필요하다.) ,
이제

br solver.cpp:225 

처럼 GDB에서 브레이크 포인트 명령을 줄 수 있으며 (즉, 프로그램을 유지했다) 두 번째 GDB 창에서 continue 명령을 줄 때 당신은 메시지

같은
Breakpoint 1 at 0x7f2cccf70397: file src/caffe/solver.cpp, line 226. (2 locations) 

볼 수 있습니다 파이썬 코드가 다시 실행됩니다. 물론 첫 번째 gdb 창에 키 입력을해서 처리를 진행시켜야합니다.
적어도 파이썬 프로그램을 실행하는 동안 C++ 코드를 디버깅 할 수 있습니다.

나는 파이썬과 C++ 디버깅을 동시에 할 수 있는지 나중에 확인했다. ddd -pydb prog1.py options..과 같은 디버거 (DDD)를 시작하고 위에서 설명한 방법을 사용하여 다른 DDD를 연결합니다. 이제 파이썬과 C++에 대한 중단 점을 설정하고 각 창에서 다른 디버그 함수를 사용할 수 있습니다. (나는 이것을 몇 달 전에 알고 있었으면 좋았을 것입니다.

enter image description here

편집 : PID를 얻을, 대신 ps -aux | grep python 할 수 있습니다. 이 pid는 ddd의 pid 다음입니다.

+0

pdb.set_trace()가 더 좋을 것입니다. 파이썬을 일시 중지 시키려면 궁극적으로는 동일한 효과가 있습니다. – AndyG

+0

@AndyG 아, 그게 너무 작동합니다. 감사. –

2

비슷한 문제가 있었지만 Chan's answer (MAC OS X 10.12.4)에서 해결 방법을 얻지 못했습니다. 대신 다음이 나를 위해 일했습니다.

  1. boost.Python 모듈을 가져 와서 사용하는 python 스크립트 test.py을 작성하십시오.

    > lldb python3 test.py 
    (lldb) target create "python3" 
    Current executable set to 'python3' (x86_64). 
    (lldb) settings set -- target.run-args "test.py" 
    (lldb) run 
    Process 46189 launched: '/Users/me/anaconda/bin/python3' (x86_64) 
    test.cpython-36m-darwin.so was compiled with optimization - stepping may behave oddly; variables may not be available. 
    Process 46189 stopped 
    * thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x10d4b3000) 
    frame #0: 0x00000001019f49c2 test.cpython-36m-darwin.so`std::__1::enable_if<true, void>::type (anonymous namespace)::Render2D<double>::add_particle<true, 5ul>(float*, float, float, float, float) const [inlined] mylib::SSE::packed<8ul, float>::loadu(
        944  { return {_mm256_load_ps(p)}; } 
        945  /// load from unaligned memory location 
        946  static __always__inline packed loadu(const element_type*p) noexcept 
    -> 947  { return {_mm256_loadu_ps(p)}; } 
        948  /// load from aligned memory location, using template arg for alignment 
        949  template<bool aligned> 
    
        950  static __always_inline enable_if_t< aligned, packed> 
    

PID를 획득하고 별도의 창이나 설정 한 중단 점에서 디버거를 시작할 필요를 제공하지 디버거

lldb python3 test.py 

에서

  • 시작 파이썬.