python卡死了怎么办?
一般的python程序卡死,可以用pycharm debug。但是有时候是python和c/c++库混合开发,比如pyqt或者boost python程序卡死,就非常难查。以前都是二分法注释代码查找问题,异常低效。
于是我尝试了vs2017的新功能:python & c++ 混合调试 Debug Python and C++ together
vs2017 python
vs一直被称为宇宙最强IDE,貌似python支持是vs2017新加的功能。相比pycharm之类的python编辑器,vs2017最大的优势就是在python和native c/c++代码的混合调试。包括:
- python / c++ 调用栈合并显示
- python / c++ 都可以断点
- python / c++ 代码之间step
- python / c++ 对象都可以watch
由于python的性能瓶颈,很多时候混合开发需要同时调试,这正是我们需要的!
环境搭建
下面以Sunshine
(一个PyQt5程序)为例
- 安装vs2017 python支持
-
导入Sunshine项目,会在主目录生成Sunshine.sln,以后都可以双击打开了
New Project->Python->From Existing Python Code
- 按照官网文档配置Enable mixed-mode debugging in a Python project
- 安装python的
pdb
文件,3.6直接用python installer安装,参考这里 - 配置
pdb
文件,主要是qt5的。qt5.9之后提供了pdb文件下载,5.11.2的在这里(PyQt最新版5.11.3,用的是Qt5.11.2,别问我为什么知道) - 选择
Sunshine.py
F5启动!
启动会比较慢,从输出窗口可以看出vs再加载各个py文件的symbol。。。(额,毕竟是试验性的功能)
让我们试试吧
卡死时候暂停
假设我们现在的Sunshine卡死了,这时候点击vs上的暂停按钮,就能立马停住。
回想起Pycharm停不住的恐惧!毕竟vs是native的暂停,宇宙第一!
强大的混合调试
这时候就能使用强大的混合调试功能了,包括但不限于:
- 同时查看python/c++ callstack
- callstack双击跳转到源码
- 切换线程
- 查看locals
混合的单步调试
以前python调到Qt里面去之后,就不知道发生了什么,现在可以从python step到c++中。
双击callstack中的c++ frame,vs会提示你打开。当然,这需要你本地下载了qt的c++代码。
然后你就可以在c++中打断点,做各种基本操作了
换成Attach模式
vs Debug启动python项目真的超级慢(感觉是有bug),而且我们经常是使用过程中进程卡死,这时候就需要Attach到卡死的python进程。
Debug->Attach to Process
连上之后所有功能一样使用