调整目录结构:以 vibe记录 为仓库根
This commit is contained in:
@@ -0,0 +1,198 @@
|
||||
# CTF 中文输入法排障记录
|
||||
|
||||
> **日期**:2026-07-23
|
||||
> **系统**:Windows 10 Pro for Workstations 10.0.19045
|
||||
|
||||
---
|
||||
|
||||
## 问题现象
|
||||
|
||||
1. **新版微软拼音完全无法打字** —— 切换到新版输入法后,输入无任何响应
|
||||
2. **兼容模式可以正常打字** —— 在输入法设置中启用"使用旧版微软拼音"后恢复正常
|
||||
3. **CTF 加载程序 (ctfmon.exe) CPU 占用异常偏高** —— 累积 CPU 时间达 102 秒(正常应低于 10 秒)
|
||||
|
||||
---
|
||||
|
||||
## 排查过程
|
||||
|
||||
### 第一步:排除其他进程干扰
|
||||
|
||||
最初怀疑是《战舰世界》(WorldOfWarships64) 占用 CPU 导致输入法无响应。经确认,**无论是否开启游戏,问题都存在**,排除外部进程干扰。
|
||||
|
||||
### 第二步:检查 CTF 核心进程
|
||||
|
||||
```
|
||||
进程 PID CPU(秒) 内存(MB)
|
||||
──── ─── ─────── ────────
|
||||
ChsIME 10244 7.50 34.90
|
||||
ctfmon 22992 102.10 21.70 ← 异常偏高
|
||||
TextInputHost 16820 6.90 16.70
|
||||
```
|
||||
|
||||
ctfmon CPU 时间 102 秒说明 CTF 框架内部存在死循环或反复崩溃重启。
|
||||
|
||||
### 第三步:定位损坏源
|
||||
|
||||
检查关键目录:
|
||||
|
||||
| 路径 | 状态 |
|
||||
|------|------|
|
||||
| `C:\Windows\System32\InputMethod\CHS\` | ✅ 10 个核心文件,数字签名有效 |
|
||||
| `C:\Windows\IME\IMESC\` | ❌ 不存在(正常) |
|
||||
| `C:\Windows\IME\zh-CN\` | ⚠️ 空目录(异常) |
|
||||
| `%APPDATA%\Microsoft\InputMethod\Chs\` | 🔴 **65,544 个文件!** |
|
||||
|
||||
### 第四步:精确打击
|
||||
|
||||
用户缓存目录文件分析:
|
||||
|
||||
```
|
||||
扩展名 数量
|
||||
────── ────
|
||||
.tmp 65535 ← ← ← 罪魁祸首
|
||||
.dat 8 ← 用户词典等正常文件
|
||||
.bak 1 ← 词典备份
|
||||
```
|
||||
|
||||
**65,535 个 `.tmp` 临时文件**把输入法缓存目录撑爆。正常状态下这个目录只应有不到 20 个 `.dat` 文件。
|
||||
|
||||
---
|
||||
|
||||
## 根因分析
|
||||
|
||||
### 直接原因
|
||||
|
||||
新版微软拼音(TSF/CTF 框架)启动时会扫描 `%APPDATA%\Microsoft\InputMethod\Chs\` 目录以加载用户词典、输入历史等数据。**65,535 个损坏的临时文件**导致每次扫描都陷入卡死状态(读取超时、IO 阻塞或循环重试),最终输入法框架完全失去响应。
|
||||
|
||||
### 为什么兼容模式不受影响
|
||||
|
||||
兼容模式使用的是旧版 IMM32(Input Method Manager 32)框架,其数据存储路径和加载机制与新版 TSF/CTF 不同,不经过该缓存目录,因此不受影响。
|
||||
|
||||
### 为什么会产生 65535 个 tmp 文件
|
||||
|
||||
`.tmp` 文件是输入法写入缓存时的中间产物,正常流程是:**写入 .tmp → 重命名为 .dat**。以下原因可能导致文件堆积:
|
||||
|
||||
1. **写入过程中被中断**(强制关机、进程被杀、系统崩溃)
|
||||
2. **杀毒软件锁文件**,阻止重命名操作
|
||||
3. **磁盘满**导致写入失败,残留碎片文件
|
||||
4. **CTF 框架本身崩溃**,写入事务没有正确提交
|
||||
|
||||
> 65,535 是一个特殊数字(2¹⁶ - 1,即 16 位无符号整数最大值),暗示文件名计数器可能已经溢出回卷。
|
||||
|
||||
---
|
||||
|
||||
## 解决方法
|
||||
|
||||
### 核心操作:清空损坏缓存
|
||||
|
||||
```powershell
|
||||
# 1. 停止输入法相关进程
|
||||
Get-Process -Name "ChsIME","ctfmon","TextInputHost" -ErrorAction SilentlyContinue `
|
||||
| Stop-Process -Force
|
||||
|
||||
# 2. 只删除 .tmp 临时文件(保留用户词典 .dat/.bak)
|
||||
Get-ChildItem "$env:USERPROFILE\AppData\Roaming\Microsoft\InputMethod\Chs\*.tmp" `
|
||||
| Remove-Item -Force
|
||||
|
||||
# 3. 进程会被 Windows 自动重启,无需手动操作
|
||||
```
|
||||
|
||||
### 保留的用户数据
|
||||
|
||||
| 文件 | 大小 | 用途 |
|
||||
|------|------|------|
|
||||
| `ChsPinyinUDL.dat` | 47 KB | 用户自定义词典 |
|
||||
| `ChsPinyinUDL.dat.bak` | 47 KB | 词典备份 |
|
||||
| `ChsPinyinIH.dat` | 256 KB | 输入历史 |
|
||||
| `ChsPinyinPinnedCands.dat` | 1 KB | 固定候选词 |
|
||||
| `ChsPinyinDeletedCands.dat` | 1 KB | 已删除候选词 |
|
||||
|
||||
---
|
||||
|
||||
## 验证结果
|
||||
|
||||
删除后目录文件数:**65,544 → 9**
|
||||
|
||||
```
|
||||
进程 PID 内存
|
||||
──── ─── ────
|
||||
ChsIME 22464 8.80 MB
|
||||
ctfmon 584 27.60 MB
|
||||
TextInputHost 14876 67.90 MB
|
||||
```
|
||||
|
||||
CTF 加载程序 CPU 占用恢复正常,新版输入法恢复可用。
|
||||
|
||||
---
|
||||
|
||||
## 技术背景
|
||||
|
||||
### Windows 两套输入法框架
|
||||
|
||||
| | 旧版 (IMM32) | 新版 (TSF/CTF) |
|
||||
|---|---|---|
|
||||
| 架构 | 1990 年代设计 | Windows 8+ |
|
||||
| 多线程支持 | 差 | 好 |
|
||||
| 输入法切换 | 全局切换 | 按窗口独立 |
|
||||
| 应用兼容性 | 广泛 | 现代应用 |
|
||||
| 中文输入法选项 | "兼容模式" | 默认新版 |
|
||||
|
||||
### CTF (Collaborative Translation Framework)
|
||||
|
||||
CTF 是 TSF(Text Services Framework)的补充组件,负责:
|
||||
- 在输入法和应用程序之间传递文本
|
||||
- 管理输入法进程的生命周期
|
||||
- 协调多个输入法之间的切换
|
||||
|
||||
`ctfmon.exe` 是 CTF 的监控进程,它挂了 → 所有基于 TSF 的输入法都不可用。
|
||||
|
||||
---
|
||||
|
||||
## 如果问题再次出现
|
||||
|
||||
### 快速自查步骤
|
||||
|
||||
1. 检查缓存文件数量:
|
||||
```powershell
|
||||
(Get-ChildItem "$env:APPDATA\Microsoft\InputMethod\Chs" -Recurse).Count
|
||||
```
|
||||
正常应 < 100。
|
||||
|
||||
2. 检查 ctfmon CPU 占用:
|
||||
```powershell
|
||||
(Get-Process ctfmon).CPU
|
||||
```
|
||||
刚启动的进程 CPU 时间应接近 0。
|
||||
|
||||
3. 如果问题频繁发生,排查:
|
||||
- 最近是否频繁强制关机?
|
||||
- 杀毒软件是否对 `%APPDATA%\Microsoft\InputMethod\` 目录有误报?
|
||||
- 磁盘剩余空间是否充足(建议 > 10 GB)?
|
||||
|
||||
### 终极方案:重建输入法
|
||||
|
||||
如果清缓存无效,使用 PowerShell 重新注册输入法:
|
||||
|
||||
```powershell
|
||||
# 移除中文语言包
|
||||
$LangList = Get-WinUserLanguageList
|
||||
$LangList.RemoveAll({ $args[0].LanguageTag -eq 'zh-Hans-CN' })
|
||||
Set-WinUserLanguageList $LangList -Force
|
||||
|
||||
# 重新添加
|
||||
$LangList.Add("zh-Hans-CN")
|
||||
Set-WinUserLanguageList $LangList -Force
|
||||
```
|
||||
|
||||
> ⚠️ 这会丢失所有用户词典和输入历史,仅作为最后手段。
|
||||
|
||||
---
|
||||
|
||||
## 相关路径速查
|
||||
|
||||
| 路径 | 说明 |
|
||||
|------|------|
|
||||
| `%APPDATA%\Microsoft\InputMethod\Chs\` | 用户词典和输入历史缓存 |
|
||||
| `C:\Windows\System32\InputMethod\CHS\` | 简体中文 IME 核心文件 |
|
||||
| `C:\Windows\IME\zh-CN\` | 语言资源文件 |
|
||||
| `C:\Windows\System32\ctfmon.exe` | CTF 加载程序 |
|
||||
Reference in New Issue
Block a user