一次离奇的 VSCode CPU 爆红100%排查经历

一个星号*引发的惨案

问题现象

那天,我像往常一样打开项目准备写代码,却发现 VSCode(后来换 Trae 也一样)突然变得异常卡顿:

  • Extension Host 进程 CPU 占用飙升到 100%+
  • 电脑风扇狂转,像要起飞一样
  • 整个编辑器卡死,鼠标都飘了

一开始以为是某个扩展在搞事情,于是开始了常规排查:

操作 结果
禁用所有扩展 ❌ 问题依旧
重装编辑器 ❌ 问题依旧
安全模式启动 ❌ 问题依旧

正当我怀疑人生的时候,发现了一个诡异的现象:其他项目完全正常

这就很有意思了 —— 既然其他项目都好好的,问题一定出在这个项目的某个独特属性上。

排查过程

1. 进程分析

打开系统监视器,看到了惊人的一幕:

Extension Host 居然派生出了 20+ 个 rg --files 进程,每个都在疯狂扫描文件:

rg --files --hidden --case-sensitive --no-require-git --no-ignore-parent --follow --no-config

这些进程的 CPU 累积占用超过 60%,系统直接响应缓慢。

rgripgrep 的缩写,一个超快的文本搜索工具,VSCode/Trae 用它来索引项目文件。

2. 项目规模检查

我首先怀疑是不是项目太大了?但检查后发现:

$ find . -type f | wc -l
2958

不到 3000 个文件,这个规模绝对不应该导致 CPU 爆炸。

3. 对比分析

项目 状态
JZJ_theta* ❌ CPU 爆炸
其他任意项目 ✅ CPU 正常

既然其他项目都正常,问题一定出在这个项目的某个独特属性上。

4. 真相大白

检查项目路径时,我愣住了:

$ ls ~/
JZJ_theta*  # 注意这个星号!

项目名称中包含了 * 字符!

我突然意识到 —— 这个项目是为了测试 Theta* 算法临时创建的,随手打了个 JZJ_theta*,没想到这个星号成了罪魁祸首。

根本原因

VSCode/Trae 内部使用 glob 模式进行文件匹配。路径中的 * 被解释为通配符,导致了一系列连锁反应:

路径包含 * 
    ↓
rg 命令将 * 展开为"匹配所有文件"
    ↓
触发递归扫描,甚至可能扫描整个文件系统
    ↓
启动大量并行进程
    ↓
CPU 爆炸 💥

简单来说:* 在文件路径中是特殊字符,不应该被用作普通文件名。

解决方案

找到问题后,解决就很简单了 —— 重命名项目目录,去掉特殊字符:

mv ~/JZJ_theta* ~/JZJ_theta_star

然后重新打开项目,问题彻底解决

就这么简单,一个 mv 命令,世界清净了。

经验总结

✅ 项目命名规范建议

推荐 不推荐 原因
my_project_v1 my_project_v* * 是通配符
ros_ws ros_ws* * 是通配符
theta-star theta* * 是通配符
JZJ_theta_star JZJ_theta* * 是通配符

安全字符集:字母、数字、下划线 _、连字符 -、点 .

避免使用的字符

  • * ? —— glob 通配符
  • [ ] { } —— 括号扩展
  • | —— 管道符号
  • < > —— 重定向符号
  • $ —— 变量引用
  • ! @ # & ( ) 等 —— 各种特殊含义

🔍 类似问题排查思路

如果你也遇到类似的诡异问题,可以按这个顺序排查:

  1. 确认问题范围:是单个项目还是所有项目?
  2. 检查进程:哪些进程在消耗 CPU?(top/htop/htop
  3. 对比分析:问题项目 vs 正常项目的差异
  4. 检查路径:是否包含特殊字符?是否指向系统目录?
  5. 二分法:禁用扩展、安全模式、重装 → 排除干扰项

📝 向编辑器反馈

这本质上是 VSCode/Trae 的一个 bug —— 路径中的特殊字符应该被正确转义。已向相关团队反馈此问题。

写在最后

有时候,问题不在代码,不在扩展,不在编辑器配置,而在于一个不起眼的星号

一个简单的重命名,解决了困扰已久的 CPU 爆炸问题。

希望这篇小记能帮助遇到类似问题的开发者。


💡 深有体会

经历了这次事件,我终于明白为什么很多地方对命名有这么多符号限制了。

以前总觉得那些限制太严格,心里还嘀咕:“至于吗?不就是名字而已。”

  • 变量名不能用特殊字符
  • 文件名不能包含 *?<>|: 等符号
  • 项目名只能字母数字下划线

现在彻底懂了 —— 每一个看似繁琐的限制,背后可能都是血泪教训

字符 在 Shell 中的含义
* 匹配任意多个字符
? 匹配单个字符
` `
< > 输入/输出重定向
& 后台运行
$ 变量引用
空格 参数分隔符

这些字符在编程环境、命令行、文件系统里都有特殊含义。如果允许它们出现在文件名中,就可能被各种工具"误解",引发意想不到的灾难。

命名规范不是束缚,而是保护。

遵守规范,看似多了一分约束,实则少了一分踩坑的风险。

这次一个星号引发的 CPU 爆炸,就是最好的教训。

“The bitterness of poor quality remains long after the sweetness of meeting the schedule has been forgotten.” —— 赶工期的甜蜜早已遗忘,低质量的苦涩却长存。

同理:图一时方便用了特殊字符,后续的坑可能让你哭都哭不出来。

更多推荐