原来还可以这样调试Python程序

很多时候,人认知以外的事情总会让人出乎意料。这不,最近本想用Python读取某个进程中数据,结果无意发现了Python调试时还有这样的骚操作。结果,搜索了一下,发现在16年的时候就已经有人提出了相关的内容,可惜没有引起多大的风浪。

调试Python程序

如果说Python中哪个IDE你最常用,70%的人会说PyCharm。虽然卡的不行不行的,但是升级下内存立即就运行如飞。细心的朋友可能会发现在PyCharm中调试的中有1个Attach to Process的选项,类似如下:

在这里插入图片描述
当然,这里我要讲的不是如何用PyCharm如何调试Python程序,而是pyrasite这个工具。
pyrasite工具是个比较有意思的工具,曾几何时,在程序出现问题的时候,总是想着如果能获取到异常时的变量的情况就好了。结果,发现pyrasite这个工具可以满足我这个小小的心愿。

有趣的Pyrasite

pyrasite工具是利用ptrace来实现调试功能的,最常用的实现就是应用级别的GDB。
为了能顺利的使用pyrasite工具,除了使用如下pip安装对应的包外,还需要安装GDB工具。这里以Linux为例进行说明:

apt-get install python-dbg gdb   #Ubuntu
yum install gdb python-debuginfo #Centos
pip install pyrasite

安装完成后,还需要让内核支持进程调试:

echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope

这里我们直接关闭内核对进程调试的检查,否则后续的操作会发现程序卡住不动。
接下来,我们需要获取需要调试的Python的进程PID,可以通过os模块直接获取:

import os

PID = os.getpid()

接下来,见证奇迹的时候到了,我们使用 pyrasite-shell 工具对指定PID进行附着,例如上面得到的PID为2112,则有:

pyrasite-shell 2112

之后如果不出意外的就会进入Python的交互环境中。下面我们就可以进行一些我们想做的事情,比如获取变量的值、修改变量的内容等。比如原交互模式为:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
>>> import os
>>> os.getpid()
2112
>>> a = "Hello,Python"

附着到对应的进程后,我们可以直接输入:

>>> a
"Hello,Python"
>>> a = "Hello,Java"

结果回到原来的交互模式下,会发现变量a的值被修改了。

当然,这是1个简单的示例。实际可以根据需要,进行扩展。

由于是附着在进程上,因此彼此之间共享着相同的数据。对于Windows平台上,通过DLL注入应该也能实现相同的效果。

结语

实际开发中还是老老实实用PyCharm提供的各种调试的工具,只是这个无意发现的方式,提供了另外1种调试的方式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值