错题集
May God Bless You

前言

  在开发过程中我们有时需要根据不同的语言来开发不同的模块,例如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++动态库

  1. 打开VSCode->打开工程文件夹
  2. 调试配置,根据图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调试流程可以总结成:

  1. 启动python进程P,并让其stop
  2. 使用Attach方式连接进程P
  3. 让P进程继续运行,直到断点位置
  4. 调试ing~~~~
  5. 断开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的动态库)

 

posted on 2018-01-11 17:48  野蛮小卒  阅读(3491)  评论(0编辑  收藏  举报