通过Boost一起调试Python和C++ - python

我可以使用ddd -pydb prog.py调试Python代码。所有python命令行参数也可以在prog.py之后传递。就我而言,许​​多类已经在C++中实现,使用boost-python公开给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 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 -pydb prog1.py options..一样启动调试器(DDD),并使用上述方法附加另一个DDD。现在,您可以为python和C++设置断点,并在每个窗口中使用其他调试功能(我希望几个月前知道这一点。它应该会有所帮助。)。

通过Boost一起调试Python和C++ - python

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

在Python和C++之间传输数据而无需写入Windows和Unix文件 - python

我有预先存在的python和C ++文件,其中python文件定义了许多点,而C ++代码利用其现有库进行了所需的计算。最终产品是C ++代码写入的文件。我正在寻找一种在python中获取2000点列表的方法,将其传递给函数,然后执行所有C ++代码并输出我需要的文件。其他注意事项。这必须是可以在Linux或Windows机器上工作的东西,并且最少安装新插件…

如何锁定终端运行的perl,obj c,c++,python和ruby等脚本的源代码? - python

我想出售我在perl,obj c,c ++,python,ruby,bash,php等中制作的脚本等它们都在终端中运行。 (Linux)如何锁定源代码,以便无需人们访问源代码即可分发我的脚本..?换句话说,如何将在Terminal中运行的程序的源代码锁定,以便人们可以使用该程序(如果该代码已下载到他们的Linux机器上,但他们无法访问实际的源代码)?例:ex…

如何用Cython保持C++类名不变? - c++

我有一个名为Foo的C++类。如果遵循Cython C++ tutorial,则需要以其他方式调用Python类,例如PyFoo。但是我确实也需要调用Python类Foo。如何有效地做到这一点?编辑:我正在尝试接口以前与Boost Python接口的现有C++库。由于不同的原因,我想测试Cython。由于使用Boost:Python调用了Python类,因此…

在Python中以与C++相同的精度乘以两倍 - python

我正在将C++程序重写为Python。我需要乘以2的双精度数,但C++和Python不会给出相同的结果。这是带有“硬编码”值的示例: C++ printf("%f", ( 44474025505478620106407223274000875520.0 * 5454277033526873088.0 ) ); >>> 2…

在Java中,执行“ ++++++++”表达式,编译器未报告任何错误并且可以正确执行? - java

我用eclipse编写了这段代码,用war写过,结果为3d。public static void main(String[] args) { double a = 5d + + + + + +-+3d; System.out.println(a); } 参考方案 您的表情可以改写为(5d) + (+ + + + +-+3d) 其中第一个+是应用于两个操作数的…