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 位无符号整数最大值),暗示文件名计数器可能已经溢出回卷。


解决方法

核心操作:清空损坏缓存

# 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. 检查缓存文件数量:

    (Get-ChildItem "$env:APPDATA\Microsoft\InputMethod\Chs" -Recurse).Count
    

    正常应 < 100。

  2. 检查 ctfmon CPU 占用:

    (Get-Process ctfmon).CPU
    

    刚启动的进程 CPU 时间应接近 0。

  3. 如果问题频繁发生,排查:

    • 最近是否频繁强制关机?
    • 杀毒软件是否对 %APPDATA%\Microsoft\InputMethod\ 目录有误报?
    • 磁盘剩余空间是否充足(建议 > 10 GB)?

终极方案:重建输入法

如果清缓存无效,使用 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 加载程序
S
Description
写一下各种奇奇怪怪的bug和排障记录
Readme
133 KiB
2026-09-23 15:24:28 +08:00
Languages
Python 73.9%
PowerShell 24%
Batchfile 2.1%