一起调试 Python 和 boost 暴露的 C++
Debugging Python and C++ exposed by boost together
我可以使用 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
当然,我在使用调试选项编译 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' 命令。如果不是(只使用 link 中的 gdb
),我应该能够调试 Python 脚本,而不是像 link 中那样交互式地给出 python 命令.
我在 运行宁 python 时发现了如何调试 C++ 部分。 (在阅读 Python 书中的进程 ID 检测时意识到这一点。)。
首先你 运行 python 包含 C++ 程序的程序。在 python 程序开始时,使用 raw_input() 让程序等待您的输入。但就在那之前做 print os.getpid()
(当然你应该导入 os 包)。当您 运行 python 程序时,它会打印您正在 运行ning 的 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
现在,支持 ose C++ 共享库是 _caffe.so(这是我的情况。这个 _caffe.so 库包含所有 C++ 代码和 boost 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 window(保存程序)中给出 continue
命令时,python 代码再次 运行s。当然,您应该在第一个 gdb window 中输入一个键以使其继续。
现在至少你可以在 运行 宁 python 程序的同时调试 C++ 代码(这就是我想要做的)!
我后来检查了我是否可以同时进行 python 和 C++ 调试并且它有效。您像 ddd -pydb prog1.py options..
一样启动调试器 (DDD) 并使用上述方法附加另一个 DDD。现在您可以为 python 和 C++ 设置断点,并在每个 window 中使用其他调试函数(我希望我早几个月就知道这一点。它应该有很多帮助。)。
编辑:要获取 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>
无需获取 pid 并从单独的 window 启动调试器或设置任何断点。
我可以使用 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
当然,我在使用调试选项编译 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' 命令。如果不是(只使用 link 中的 gdb
),我应该能够调试 Python 脚本,而不是像 link 中那样交互式地给出 python 命令.
我在 运行宁 python 时发现了如何调试 C++ 部分。 (在阅读 Python 书中的进程 ID 检测时意识到这一点。)。
首先你 运行 python 包含 C++ 程序的程序。在 python 程序开始时,使用 raw_input() 让程序等待您的输入。但就在那之前做 print os.getpid()
(当然你应该导入 os 包)。当您 运行 python 程序时,它会打印您正在 运行ning 的 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
.
现在,支持 ose C++ 共享库是 _caffe.so(这是我的情况。这个 _caffe.so 库包含所有 C++ 代码和 boost python 包装函数)。 27352 是 pid。然后在另一个 shell 中像
一样启动 gdbgdb 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 window(保存程序)中给出 continue
命令时,python 代码再次 运行s。当然,您应该在第一个 gdb window 中输入一个键以使其继续。
现在至少你可以在 运行 宁 python 程序的同时调试 C++ 代码(这就是我想要做的)!
我后来检查了我是否可以同时进行 python 和 C++ 调试并且它有效。您像 ddd -pydb prog1.py options..
一样启动调试器 (DDD) 并使用上述方法附加另一个 DDD。现在您可以为 python 和 C++ 设置断点,并在每个 window 中使用其他调试函数(我希望我早几个月就知道这一点。它应该有很多帮助。)。
编辑:要获取 pid,您可以改为 ps -aux | grep python
。这个 pid 是 ddd 的下一个 pid。
我遇到了类似的问题,但未能使
- 编写一个 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>
无需获取 pid 并从单独的 window 启动调试器或设置任何断点。