调试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上)。相反,下面的方法对我有效
test.py
,该脚本导入并使用boost.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暂停的更好方法,但最终它们具有相同的效果。