3.8 KiB
3.8 KiB
BUG-20261006-0003
适用场景:记录问题本身,不展开完整修复方案。修复内容写入对应的 Fix 文档。
基本信息
- ID: BUG-20261006-0003
- 标题: 阶段 0B 持锁调用 IMM32 定位导致 WndProc 重入死锁
- 状态:已修复(微软拼音 Forward/Consume 与搜狗 fail-open 人工运行均保持响应)
- 严重性:S1
- 优先级:P0
- 模块: 阶段 0B / InputProbe / WndProc / IMM32
- 版本 / 分支:
master,0B 开发中未提交改动 - 环境: Windows 11、EasyX 25.9.10、ANSI HWND、CP936、DPI-unaware 96 DPI、微软拼音与搜狗人工探测
- 发现人: 用户真实 IME 人工探测
- 关联 Fix ID: Fix-BUG-20261006-0003
问题描述
- 现象: 启动微软拼音
ObserveAndForward人工探测后,EasyX 窗口卡顿并进入“未响应”,无法继续输入。 - 影响范围: 0B-3 人工 IME A/B 无法执行;该现象由诊断夹具自身造成,不能作为微软拼音或 Forward 行为异常的证据。
- 期望结果: IMM32 定位不得持有探测状态锁;同步重入的 WndProc 消息仍应被严格有序记录,窗口保持可交互。
复现信息
- 前置条件: 启用 0B 人工 Composition 规则和固定 IME caret/line rect。
- 复现步骤:
- 启动微软拼音
ObserveAndForward人工探针。 - 激活 EasyX 窗口并尝试中文输入。
- 窗口出现卡顿,随后无法输入并显示“未响应”。
- 复现概率:本轮稳定复现
- 证据目录:
TestResults/InputProbe/0B/20261006-231604-636-4bc775a1-a3f8-41b9-b466-1cce740bc195/forward - 日志边界: 已耐久写入 268 条记录,
sequenceStrict=true、recordsLost=0,但没有WM_CLOSE/session_end;最后一批记录完整结束于普通 Space KeyUp。死锁发生点很可能位于下一次定位调用且早于新记录入队,因此日志不能直接给出阻塞栈。
根因分析
inputProbeWndProcEnter持有不可重入的ProbeState::lock时调用ImmGetContext、ImmSetCompositionWindow和ImmSetCandidateWindow。- IMM32 定位 setter 可以同步重入同一窗口过程;重入后的探测入口再次请求同一把 SRW 独占锁,当前线程因此自锁。
- 直接把 setter 移到锁外仍不充分:重入消息如果再次满足定位触发条件,会递归发起新的定位调用,需要独立的线程内重入抑制。
- 本问题由
BUG-20261006-0002的固定锚点修复实现引入,不是 EasyX、微软拼音或消息消费策略本身的缺陷。
跟踪信息
- 首次发现时间: 2026-10-06 23:16
- 最后更新时间: 2026-10-07
- 修复版本: 待提交
- 验证版本: Debug x64 探测构建、默认单元测试 15/15、UI fixture 1 轮、微软拼音 Forward/Consume 与搜狗 fail-open 真实复验通过
- 关联记录:
BUG-20261006-0002、Fix-BUG-20261006-0002
关闭证据
- 有效运行:
TestResults/InputProbe/0B/20261006-234544-007-603391f8-3a14-4c90-ab41-4d891ceb8f46/forward - 结构结果:
experimentValidity=valid、sequenceStrict=true、recordsLost=0、规则唯一命中并 Forward、imePosition=18/18、imePositionOrphanCount=0、WM_CLOSE/session_end完整。 - 人工结果: 窗口保持响应并可正常输入;组合串和候选 UI 位于固定锚点附近,Escape 流程完成后窗口正常关闭。
- 截图:
manual-evidence/microsoft-pinyin-forward-composition-position-pass.png - 截图 SHA-256:
1447E9F1AAD2C90A787AADC2594C78AE596336FC6D569EA1A22C69B2FCA5C3D5 - 补充证据: 搜狗最终 fail-open 运行中窗口保持响应,定位 3/3、无孤立结果、零丢失且关闭完整;见
TestResults/InputProbe/0B/20261007-033454-763-56a2630b-bf2a-4431-b501-38f6ff977dfe/consume。 - 关闭边界: 本 BUG 只关闭“持锁定位导致重入死锁”;搜狗未暴露 Composition 生命周期所形成的
MustForward结论归 0B 规格,不属于死锁残留。