前言
在开发过程中我们有时需要根据不同的语言来开发不同的模块,例如TensorFlow就是提供python的接口,同时在底层调用了C++的函数。我最近在工作中也遇上了同样的问题,需要python来调用C++的.so库,在网上找了一圈,没有很符合我需求的结果,在此记录下我花了一天时间搞的结果。
测试环境
Ubuntu(Linux)
操作过程
1.首先我们得创建一个能被Python调用的共享库,这个库如何生成以及python如何调用C++网上有很多文章参考,在文末我提供了一些链接
2.根据Python官网[1]的说明针对不同系统下载不同的gdb扩展工具:
Fedora:
-
sudo yum install gdb python-debuginfo
Ubuntu:
-
sudo apt-get install gdb python2.7-dbg
Centos*:
-
sudo yum install yum-utils sudo debuginfo-install glibc sudo yum install gdb python-debuginfo
3.使用gdb测试是否可用:
可以看到基本上已经可以使用gdb来对Python调用的C++共享库进行调试了。更进一步的,如果我们想通过VSCode来对库进行可视化的调试,又该如何处理呢?
GDB中STL pretty print
我们在使用gdb时,老是会对其显示的一些stl容器不能很好显示而感到不爽,从gdb7.0开始,python脚本导入gdb中,所以为了能让gdb中的vector更好的显示,需要在你的用户目录即~下放置一个.gdbinit文件和python的文件夹,这样操作之后,gdb在启动时就
会运行这个.gdbinit从而对STL容器进行pretty print的支持,具体可以参见GDB Wiki的说明(https://sourceware.org/gdb/wiki/STLSupport?highlight=%28STL%29)
VSCode调试Python调用的C++动态库
- 打开VSCode->打开工程文件夹
- 调试配置,根据图1进入launch.json配置页面
图1
根据图2所示配置,此处需要讲解下attach的原理:attach是gdb的一个功能,用于对运行中的程序的状态进行监测,例如一些服务器中的进程不能直接以launch的方式启动,就只能以这种方式来监视。我们的项目中也同理,不能直接通过C++启动,所以需要python首先开启,然后在hello.cpp中设置getchar()或者pause进行中断进程,然后通过attach进程的方式来连接调试。(另外一种更直接的方式是通过上述所说的gdb进行调试,但这种只能通过gdb命令行的方式,可能习惯IDE的人不习惯,所以我找了这种用vscode的方式)
图2
以上配置就完成了
3.运行python主程序
此处贴出我调用的C++共享库的函数部分,由于我是用python调用c的函数作为实验的,所以此处加了extern C,在网上有c++类作为被调用的示例。
4.开始调试
选择attach对象之后,我的ubuntu上会弹出弹框让你输入密码验证,有些系统上可能不会。
5.完成调试,按红色插头断开连接,python进程继续运行
总结
所以Attach调试流程可以总结成:
- 启动python进程P,并让其stop
- 使用Attach方式连接进程P
- 让P进程继续运行,直到断点位置
- 调试ing~~~~
- 断开Attach,进程P正常运行
参考资料:
1.https://wiki.python.org/moin/DebuggingWithGdb (python官网)
2.https://code.visualstudio.com/docs/languages/cpp (VSCode官网)
3.https://github.com/Microsoft/vscode-cpptools/blob/master/launch.md (VSCode-cpptools Git网站)
4.https://www.cnblogs.com/apexchu/p/5015961.html (python调用C的动态库)