Qt Creator多次启动clangd进程且进程无法正常结束问题咨询
问题现象
- Ubuntu系统下保持Qt Creator持续开启过夜后,通过
htop观测到大量未正常退出的clangd残留进程 - 涉及运行环境:
- Qt Creator 7.0.0:基于GCC 10.3.1 20210422 (Red Hat 10.3.1-1) 64位版本构建,构建时间为2022年3月22日02:18:16,版本修订号为
638b93591b - clangd 14.0.0:源码取自Qt适配的llvm-project分支,对应提交哈希为
a8ed6c28965138fa1f2449e4ce3e9f391380d17b,适配Linux x86_64-unknown-linux-gnu平台
- Qt Creator 7.0.0:基于GCC 10.3.1 20210422 (Red Hat 10.3.1-1) 64位版本构建,构建时间为2022年3月22日02:18:16,版本修订号为
排查步骤
- 确认残留clangd的父进程归属
执行ps -ef | grep clangd查看残留进程的PPID字段:如果PPID为1(即被init进程接管),说明Qt Creator的clangd代码模型插件未正确回收已退出的子进程,属于典型的进程泄漏;如果PPID仍对应运行中的Qt Creator进程ID,说明插件内部进程生命周期管理逻辑异常,未向拉起的clangd实例发送退出信号。 - 确认clangd进程的阻塞状态
在htop中选中对应clangd进程按S键查看其当前系统调用状态:如果大量进程标记为Z(僵尸状态),说明Qt Creator未注册处理子进程退出的信号回调;如果进程标记为D(不可中断睡眠状态),通常是clangd后台索引大文件、网络挂载目录文件时触发了内核或文件系统层面的阻塞,无法响应退出请求。 - 校验clangd插件的实例创建/销毁日志
终端执行QT_LOGGING_RULES="qtc.clang*=true" qtcreator启动程序,开启clangd相关模块的调试日志,复现长时运行场景后,统计日志中clangd实例启动、销毁记录的数量差,确认是否存在打开多项目、切换编译配置时重复创建clangd实例但未触发销毁逻辑的问题。
解决建议
- 临时清理方案:执行
pkill -f clangd可一键清理所有残留clangd进程,操作不会损坏Qt Creator项目配置,后续触发代码补全、索引操作时会自动拉起新的clangd实例。 - 配置规避方案:
- 打开Qt Creator设置,进入「工具-选项-C++-Clangd」配置页,将单项目clangd实例数上限调整为1,关闭「后台自动索引非活跃项目」选项,减少无意义的clangd实例拉起。
- 若对clangd的实时诊断、补全功能无强需求,可在同配置页取消勾选「使用clangd」选项,回退到Qt内置代码模型,彻底规避该进程泄漏问题。
- 永久修复方案:
该问题是Qt Creator 7.0.0正式版自带clangd插件的已知缺陷,后续7.0.x补丁版本、Qt Creator 8及以上正式版本已经修复了多实例clangd未正常回收的逻辑问题;同时Qt适配的clangd 15+版本也修复了长时运行下进程挂起无法响应退出信号的问题,将两个组件升级到对应修复版本即可彻底解决。
内容的提问来源于stack exchange,提问作者Andrey Korostin
相关产品推荐
相关产品推荐

