• 调试Python调用的C++共享库


    前言

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

  • 相关阅读:
    面向对象第四单元(UML)及期末总结
    面向对象第三单元博客(JML)
    BUAAOO——UNIT2 SUMMARY
    面向对象第一单元总结——格式检查与定性计算
    软件工程-提问回顾与个人总结
    面向对象第三单元总结
    面向对象第二单元总结
    个人博客作业-软件案例分析
    结对项目作业
    软件工程个人项目作业
  • 原文地址:https://www.cnblogs.com/yemanxiaozu/p/8269638.html
Copyright © 2020-2023  润新知