Eclipse 2022-03/06 Pydev调试多线程Python程序断点失效
Pydev多线程调试子线程断点不命中问题
问题表现
- 环境:Eclipse 2022-03/2022-06、Python 3.6、OpenSuse 15.4
- 现象:调试多线程Python应用时,子线程内设置的所有断点均被直接跳过无法命中;手动插入
import pdb; pdb.set_trace()可正常触发调试,但无法作为常规开发方案使用 - 版本差异:同一份代码在Eclipse 2021-12及更早版本中断点可正常生效,且2022-06与2021-12版本搭载的Pydev版本均显示为9.3.0
- 工作区差异:将2021-12版本的测试工作区升级转换为2022-06格式后断点可正常命中,原有存量项目工作区始终存在该问题
- 已尝试操作:公开资料中所有基于pydevd配置开启线程断点的方案均无效
复现代码
from threading import Thread from time import sleep def myasync(f): def wrapper(*args, **kwargs): thr = Thread(target = f, args = args, kwargs = kwargs) thr.start() return thr return wrapper @myasync def dosomething(): print('doing something') sleep(2) print('really busy doing more') # 断点设置在此行 sleep(2) print('something done') if __name__ == '__main__': res = dosomething() print(type(res)) print(res) res.join() print('done')
根因定位
从调试输出日志可定位到核心异常:
- 日志开头显示
Using GEVENT_SUPPORT: True,调试器自动开启了Gevent兼容模式 - 加载完多线程追踪依赖库后仅4秒就自动触发
pydevd.stoptrace(),直接终止了全线程调试追踪,这是断点失效的直接原因
关键日志片段:0.01s - Successfully Loaded helper lib to set tracing to all threads. 4.01s - pydevd.stoptrace()
该问题属于2022版Eclipse工作区配置迁移的bug:存量工作区迁移时,Pydev的Gevent支持选项默认自动检测逻辑误判,在代码未使用Gevent、仅环境安装了Gevent包的场景下错误开启Gevent兼容模式,干扰了原生threading模块的断点追踪逻辑,导致调试器提前退出。
修复步骤
- 关闭Gevent自动兼容
打开Eclipse配置路径Window > Preferences > PyDev > Debug,找到Gevent support配置项,将默认值从Automatic修改为Off,保存配置。 - 清理失效缓存(若第一步操作后仍不生效)
关闭Eclipse,进入原有工作区的.metadata/.plugins/org.python.pydev目录,删除所有debug_config前缀的缓存文件,重启Eclipse后重新确认Python解释器路径配置。 - 验证:重新启动调试,子线程断点即可正常命中,调试日志中不会再出现提前触发的
pydevd.stoptrace()记录。
内容的提问来源于stack exchange,提问作者betelgeuse
相关产品推荐
相关产品推荐

