zoukankan      html  css  js  c++  java
  • 调试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的动态库)

  • 相关阅读:
    AcWing 1027. 方格取数 dp
    AcWing 1014. 登山 dp
    acwing 482. 合唱队形 dp
    LeetCode 1463. 摘樱桃II dp
    LeetCode 100. 相同的树 树的遍历
    LeetCode 336. 回文对 哈希
    LeetCode 815. 公交路线 最短路 哈希
    算法问题实战策略 DARPA大挑战 二分
    算法问题实战策略 LUNCHBOX 贪心
    AcWing 1100. 抓住那头牛 BFS
  • 原文地址:https://www.cnblogs.com/yemanxiaozu/p/8269638.html
Copyright © 2011-2022 走看看