linux 使用gdb 使运行中的python进程中的指定线程抛出异常(kill python线程)

最近运行的python脚本,经常遇到获取某个资源卡住的情况,这个时候想要强行让等待资源的线程结束掉,但是又希望线程结束后,其他的线程能够正常监控到该线程抛出的异常,并且能够继续往下执行,不影响该python脚本进程的执行。

搜索了一下没有搜到答案,但是在文档 zhuanlan.zhihu.com/p/208260624 中搜到了使用ctypes对线程设置抛出异常的方法,该方法使用的是通过ctypes调用cpython原生来实现设置python线程异常的方法,因此基于该方法,尝试使用gdb来将python线程手动设置抛出异常成功,方法如下:

首先上测试代码:

test.py 复制代码
import time
from threading import Thread, current_thread


def func(msg, times):
    for i in range(times):
        print(f"{hex(current_thread().ident)}: {msg}")
        time.sleep(1)


t1 = Thread(target=func, args=(1, 5))
t2 = Thread(target=func, args=(2, 60))
t1.start()
t2.start()

流程:

  1. 通过gdb attach到正在执行的python进程
  2. 打断点到某个想要抛异常的线程上(根据PyThreadState_SetAsyncExc方法的注释,在调用该方法前,需要先hold GIL,所以要先断点到该线程,保证该线程已经hold了GIL,实测如果不断到该线程,会导致python进程段错误core掉)
  3. 调用PyThreadState_SetAsyncExc方法, 来设置线程异常

实际测试结果:

首先,在linux上启动进程

然后打开另一个shell终端,ps -ef 查到正在运行的python进程,使用gdb -p pid的方式attach到python进程

先执行info threads然后找到想要抛异常的线程、gdb的线程id、python线程id,然后执行t tid的命令切到该线程,执行bt看一下栈。

我这里使用的测试代码是循环time.sleep(),因此断点打在time_sleep函数,一般断点打_PyEval_EvalFrameDefault就可以。

使用b time_sleep thread 3,打断在在gdb线程id 3的time_sleep函数, 然后按c,等待gdb执行到断点处

进入断点,也就表示该线程肯定hold了GIL,因此执行设置异常的方法:call (int) PyThreadState_SetAsyncExc(0x7f3ead9fe700, (void *)PyExc_Exception)。 (0x7f3ead9fe700是python线程id,不固定,需要随着变, PyExc_Exception可以按照自己的需要修改异常类型)

大功告成!按q退出gdb

效果:

有抛出异常的线程err打印,2也不再打印。用到实际的测试脚本中也生效!

相关推荐
qq_4135020220 分钟前
如何创建CDB公共用户_C##前缀强制规则与CONTAINER=ALL
jvm·数据库·python
yexuhgu40 分钟前
CSS如何利用-checked实现纯CSS手风琴折叠_通过状态选择器控制区域高度
jvm·数据库·python
AC赳赳老秦1 小时前
接口测试自动化:用 OpenClaw 对接 Postman,实现批量回归测试、测试报告自动生成与推送
java·人工智能·python·算法·elasticsearch·deepseek·openclaw
PILIPALAPENG1 小时前
第4周 Day 1:智能体记忆系统——给 Agent 一个"大脑"
前端·人工智能·python
DavidTaozhe1 小时前
一文搞懂外汇接口怎么实时更新美元汇率
大数据·python
用户78937733908531 小时前
Docker 部署踩坑记录:从“构建失败”到“服务跑通”,以及为什么数据被清空了
python·docker
再玩一会儿看代码1 小时前
如何理解神经网络中的权重参数?从一张图看懂模型参数量计算
人工智能·经验分享·python·深度学习·神经网络·机器学习
2301_779622411 小时前
mysql如何通过主从备份实现读写分离_配置mysql架构模式
jvm·数据库·python
m0_741173331 小时前
HTML5中WebSocket在弱网环境下的延迟抖动算法补偿
jvm·数据库·python
l1t1 小时前
astral-sh发布的musl和gnu版本standalone python 性能比较
开发语言·python