调试由boost一起公开的Python和C ++

问题描述 投票:18回答:2

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

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

当然我在用调试选项编译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++ debugging boost ddd-debugger
2个回答
8
投票

我发现了在运行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)并使用ps -aux查看EDIT *获取pid。

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

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

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

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

然后你会看到gdb启动并等待提示。 python程序被gdb中断,并在停止模式下等待(它正在等待你的键输入,但现在它真的处于stopeed模式,它需要来自第二个调试器的gdb continue命令继续进行密钥等待)。 现在你可以在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),如ddd -pydb prog1.py options..,并使用上面解释的方法附加另一个DDD。现在你可以设置python和C ++的断点,并在每个窗口中使用其他调试功能(我希望我早在几个月就已经知道了。它应该有助于吨。)。

enter image description here

编辑:要获得pid,你可以改为ps -aux | grep python。这个pid是ddd的pid的下一个。


2
投票

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

  1. 编写导入并使用boost.Python模块的python脚本test.py
  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并启动调试器或设置任何断点。

© www.soinside.com 2019 - 2024. All rights reserved.