调试Python和C++;暴露在一起

调试Python和C++;暴露在一起,python,c++,debugging,boost,ddd-debugger,Python,C++,Debugging,Boost,Ddd Debugger,我可以使用ddd-pydb prog.py调试Python代码。所有python命令行参数也可以在prog.py之后传递。在我的例子中,很多类已经在C++中实现了,它们使用Pothon使用 Boost Python < /C>。我希望我能调试python代码和C++。例如,我想像这样设置断点: break my_python.py:123 break my_cpp.cpp:456 cont 当然,我在尝试用调试选项编译C++代码后尝试,但是调试器没有交叉升压边界。有办法吗 编辑: 我看见了。

我可以使用
ddd-pydb prog.py
调试Python代码。所有python命令行参数也可以在
prog.py
之后传递。在我的例子中,很多类已经在C++中实现了,它们使用Pothon使用<代码> Boost Python < /C>。我希望我能调试python代码和C++。例如,我想像这样设置断点:

break my_python.py:123
break my_cpp.cpp:456
cont
当然,我在尝试用调试选项编译C++代码后尝试,但是调试器没有交叉升压边界。有办法吗

编辑: 我看见了。
我跟踪它,我可以对Python和C++进行调试。但我更希望使用
DDD
进行可视化调试,但我不知道如何在
DDD
中给出“targetexecpython”命令。如果不是(只使用链接>代码> gdB <代码>链接),我就可以调试一个Python脚本,而不是在链接中交互地提供Python命令。

< P>我发现了在运行Python时如何调试C++部分。(在阅读Python书籍中有关进程ID检测的内容时意识到了这一点。)
首先,运行包含C++程序的Python程序。在python程序开始时,使用raw_input()使程序等待您的输入。但就在这之前,您需要打印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++共享库是一个咖啡。所以(这是我的例子。这个咖啡。所以库有所有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中断,并在停止模式下等待(它正在等待您的密钥输入,但现在实际上处于停止模式,需要第二个调试器的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++设置断点,并在每个窗口中使用其他调试函数(我希望我早在几个月之前就知道这一点……它应该帮助了吨)。p>


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

我也有类似的问题,但未能使解决方案正常工作(在MAC OS X 10.12.4上)。相反,下面的方法对我有效

  • 编写一个python脚本
    test.py
    ,该脚本导入并使用boost.python模块
  • 在调试器中启动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>
    
    >lldb python3 test.py
    (lldb)目标创建“python3”
    当前可执行文件设置为“python3”(x86_64)。
    (lldb)设置设置--target.run-args“test.py”
    (lldb)运行
    启动进程46189:“/Users/me/anaconda/bin/python3”(x86_64)
    test.cpython-36m-darwin.so是通过优化编译的-步进可能会表现得异常;变量可能不可用。
    进程46189已停止
    *线程#1,队列='com.apple.main thread',停止原因=EXC#U BAD#U访问(代码=1,地址=0x10d4b3000)
    frame#0:0x00000001019f49c2 test.cpython-36m-darwin.so`std::u 1::enable_if::type(匿名名称空间)::Render2D::add_particle(float*,float,float,float,float)const[内联]mylib::SSE::packed::loadu(
    944{return{umm256\u load\u ps(p)};}
    945///从未对齐的内存位置加载
    946静态\uuuu始终\uuuu内联压缩加载(常量元素\u类型*p)无例外
    ->947{return{umm256{loadu\ps(p)};}
    948///从对齐的内存位置加载,使用模板arg进行对齐
    949模板
    950静态\uuu始终\uu内联启用\u如果\u t<对齐,打包>
    

  • 无需获取pid并从单独的窗口启动调试器或设置任何断点。

    这不完全是答案,但可能会给您一些想法:pdb.set_trace()可能是让Python暂停的更好方法,但最终它们具有相同的效果。