繁体   English   中英

通过Boost一起公开调试Python和C ++

[英]Debugging Python and C++ exposed by boost together

我可以使用ddd -pydb prog.py调试Python代码。 prog.py之后也可以传递所有python命令行参数。 就我而言,许​​多类都已在C ++中实现,这些类使用boost-python公开给boost-python 我希望我可以一起调试python代码和C ++。 例如,我想这样设置断点:

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

当然,在使用debug选项编译c ++代码之后,我会尝试它,但是调试器不会越过boost边界。 有什么办法吗?

编辑 :我看到了http://www.boost.org/doc/libs/1_61_0/libs/python/doc/html/faq/how_do_i_debug_my_python_extensi.html 我遵循了它,可以为python和C ++进行调试。 但是我最好是用DDD进行视觉调试,但是我不知道如何在DDD给出'target exec python'命令。 如果没有(仅在链接中使用gdb ),我应该能够调试Python脚本,而不是在链接中以交互方式提供python命令。

我发现了如何在运行python时调试C ++部分。 (在阅读有关Python书籍中的进程ID检测的文章时实现了。)。
首先,您运行包含C ++程序的python程序。 在python程序的开始处,使用raw_input()使程序等待您输入。 但是在此之前,请先print os.getpid() (当然,您应该已经导入了os包)。 当您运行python程序时,它将打印出您正在运行的python程序的pid,并将等待您的键盘输入。

python停止码:

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

或者,您可以使用import pdb,pdb.set_trace()作为下面的注释。(感谢@AndyG),请参阅EDIT *以使用ps -aux获取pid。

现在,假设C ++共享库是_caffe.so(这是我的情况。这个_caffe.so库包含所有C ++代码和boost python包装函数)。 pid是27352。 然后在另一个Shell中启动gdb

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

或者如果您想使用类似DDD的图形调试,请执行

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

然后,您将看到gdb启动并等待提示。 python程序被gdb中断,并在停止模式下等待(它正在等待您的键输入,但现在它确实处于停止模式,它需要来自第二个调试器的gdb继续命令来继续键等待)。
现在您可以在gdb中给出断点命令,例如

br solver.cpp:225

您会看到类似的消息

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

当您在第二个gdb窗口(包含程序)中发出continue命令时,python代码将再次运行。 当然,您应该在第一个gdb窗口中输入一个按键,以使其继续进行。
现在至少您可以在运行python程序时调试C ++代码(这就是我想要做的)!

后来我检查了是否可以同时进行python和C ++调试,并且可以正常工作。 您可以像ddd -pydb prog1.py options..这样启动调试器(DDD) ddd -pydb prog1.py options..并使用上述方法附加另一个DDD。 现在,您可以为python和C ++设置断点,并在每个窗口中使用其他调试功能(我希望几个月前就知道这一点。它应该会有所帮助。)。

在此处输入图片说明

编辑:要获取pid,可以执行ps -aux | grep python ps -aux | grep python代替。 此pid是ddd的pid的下一个。

我遇到了类似的问题,但未能在Chan的工作答案中获得解决方案(在MAC OS X 10.12.4上)。 相反,以下对我有用。

  1. 编写一个Python脚本test.py ,以导入并使用boost.Python模块。
  2. 在调试器中启动python

     lldb python3 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并从单独的窗口启动调试器或设置任何断点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM