VS Code实现Python与C++联合调试【经验总结】

VS Code实现Python与C++联合调试【经验总结】

  • 一、经验总结

  1. 大前提是在Linux系统,更具体点是在K* Linux下进行Python的开发、进行【Python第三方Package包】Python与C(C++)联合调试。

  2. 针对【Python第三方Package包】Python与C(C++)联合调试,WingPro与Visual Studio Code(以下简称VS Code)各有优势,必须两者结合起来用,才能事半功倍!单独使用任何其中一个都不够高效或者说完备!

  3. WingPro的优点:

    1. 纯Python开发的犀利工具,界面背景、语法高亮、调试时以Array或者Text方式查看结果,以及相比PyCharm在Kali Linux上面经常卡死,WingPro应该说是久经考验的Python开发工具;

    2. WingPro相比VS Code而言,速度貌似快一些,而且,WingPro的“多种搜索方式”“搜索所见即所得”的功能很好,而且这个“Search in Files”可以选择多种“搜索位置”,比如:搜索当前文件、搜索当前工程目录、搜索指定目录。对!就是这个“搜索指定目录”的功能非常好用,而且是以“内容搜索”方式搜索“指定目录”下面的任何文件。

    3. WingPro相比VS Code的另外一个优点是,WingPro可以设置“工程主入口点”,设置好后,不管当前点中的是什么其他文件,都可以直接调试运行;不用像VS Code一样,每次都必须点中‘main.py主入口文件’,然后进行调试!

  4. VS Code的优点:

    1. 最大最大的优点,就是,可以通过【Python C++ Debugger】插件,对Python的第三方包Package进行“Python与C++联合调试”;

    2. VS Code进行Python与C++联合调试时需要注意:之前对要深入研究的‘Python第三方包(比如ephem天体轨道数学库)’,在进行编译安装时,要通过修改《 setup.py 》,关闭‘编译优化-O3’,而设置“-O0”;具体方法参见《【需关闭编译优化】★★★设置编译器标志 Python 扩展模式 0.1.0 文档.mhtml》;

    3. VS Code能实现Python与C++联合调试:Python是工程项目代码,C++的是工程项目依赖的第三方包编译时的源码;但是,必须注意:调试的时候,Python并不会自动跳转到C++代码中进行调试

所以,必须从【第三方包】的C++源码里面找到自己感兴趣的、估计大差不差的“断点”;

针对第三方包的C++源码,包括 *.h*.c、*.cpp(貌似都用纯C来写,只有结构体、没有类)源代码,找出足够多的、感兴趣的断点后,在Python执行过程中,可能就被刚刚下的C源码中的断点拦截了!

调试控制权就从 Python 转到了 C,调试器转到了 Linux 平台下的 gdb 调试器!

必须对VS Code的“变量”“监视”调试窗口高度重视,不管是变量名称、变量表达式、变量的值,都不要视而不见!

活来了,各种变量类型、数据结构,要能够弄清楚!

这时最高效的方法就是,看到‘变量’调试窗口中莫名其妙的【变量表达式】、【变量类型】,直接用WingPro的【Search in Files】功能在“第三方包”的源码目录下面进行“文件内容搜索”,变量类型很可能就在“第三方包”源码的 *.h 或者 *.c 文件里!

此外,必须熟练掌握VS Code调试时,在“监视”窗口里面,输入“广义通用指针,强制转换为某个具体的‘结构体名称’指针”的表达式,比如下面的图片中,

0x7f57a523c660在调试的‘变量’窗口中显示的是[PyFloat_Type]类型,但我们经查询得知其对应为[PyFloatObject]类型,因此在‘监视’窗口输入

  ((PyFloatObject*)0x7f57a523c660),会发现其指向的[ob_fval]的值为36525

VS Code实现Python与C++联合调试【经验总结】_第1张图片

二、问题解决备忘(以第三方Python包ephem为例)

  1. 找到了在调试的时候,Python代码【self.sat = ephem.EarthSatellite()】运行时,对应调用的ephem内部的C代码实现。

    1. 关键是【Now】数据结构的定义,VS Code及C++插件估计是还未配置好设置,导致不能自动跳转到其定义处,导致自己找了半天,发现“Now”里面藏着 [n_epoch] 等成员!而自己却找到了没有真正使用的“ObjES(/* basic earth satellite object info */)”数据结构!

VS Code实现Python与C++联合调试【经验总结】_第2张图片

       在【self.sat = ephem.EarthSatellite()】初始化后,对ephem.EarthSatellite对象的成员变量进行赋值过程中,在Python调试时:

self.sat._e = self.eccentricity

self.sat._raan = self.raan

self.sat._M = self.mean_anomaly

self.sat._inc = self.inclination

self.sat._ap = self.aug_perigee

self.sat._n = mean_motion

VS Code是能够直接显示出成员变量的值的!而不要以为不显示!

VS Code实现Python与C++联合调试【经验总结】_第3张图片

 恍然大悟,其实Python代码【self.sat = ephem.EarthSatellite()】初始化后,该【self.sat._epoch】成员的值是0,但是在Python中读取值是【1899/12/31 12:00:00】,也就是 1900年1月0.5日。原因是,【self.sat._epoch】成员类型是“属性”,其get、set 属性具体实现时,默认的“计算基点0”是 从 【1899/12/31 12:00:00】开始的

VS Code实现Python与C++联合调试【经验总结】_第4张图片

 

你可能感兴趣的:(Python编程,python,c++,vscode)