前言

  在开发过程中我们有时需要根据不同的语言来开发不同的模块,例如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测试是否可用:

     

python ctypes 调用lib库文件_python

 

  可以看到基本上已经可以使用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的说明

 

VSCode调试Python调用的C++动态库

  1. 打开VSCode->打开工程文件夹
  2. 调试配置,根据图1进入launch.json配置页面

python ctypes 调用lib库文件_官网_02

图1

  根据图2所示配置,此处需要讲解下attach的原理:attach是gdb的一个功能,用于对运行中的程序的状态进行监测,例如一些服务器中的进程不能直接以launch的方式启动,就只能以这种方式来监视。我们的项目中也同理,不能直接通过C++启动,所以需要python首先开启,然后在hello.cpp中设置getchar()或者pause进行中断进程,然后通过attach进程的方式来连接调试。(另外一种更直接的方式是通过上述所说的gdb进行调试,但这种只能通过gdb命令行的方式,可能习惯IDE的人不习惯,所以我找了这种用vscode的方式)

 

python ctypes 调用lib库文件_官网_03


                             图2

 

 

以上配置就完成了

 

  3.运行python主程序

 

python ctypes 调用lib库文件_Python_04

此处贴出我调用的C++共享库的函数部分,由于我是用python调用c的函数作为实验的,所以此处加了extern C,在网上有c++类作为被调用的示例。

 

python ctypes 调用lib库文件_官网_05

  4.开始调试

              

python ctypes 调用lib库文件_python_06

 

选择attach对象之后,我的ubuntu上会弹出弹框让你输入密码验证,有些系统上可能不会。

 

 

python ctypes 调用lib库文件_官网_07

python ctypes 调用lib库文件_官网_08

python ctypes 调用lib库文件_官网_09

  5.完成调试,按红色插头断开连接,python进程继续运行

总结

  所以Attach调试流程可以总结成:

  1. 启动python进程P,并让其stop
  2. 使用Attach方式连接进程P
  3. 让P进程继续运行,直到断点位置
  4. 调试ing~~~~
  5. 断开Attach,进程P正常运行