Files
StellarX-kaifa/开发记录/BUG/BUG-20261006-0003-阶段0B持锁调用IMM32定位导致WndProc重入死锁.md
2026-10-07 04:09:36 +08:00

61 lines
3.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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。
- 复现步骤:
1. 启动微软拼音 `ObserveAndForward` 人工探针。
2. 激活 EasyX 窗口并尝试中文输入。
3. 窗口出现卡顿,随后无法输入并显示“未响应”。
- 复现概率:本轮稳定复现
- 证据目录: `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 规格,不属于死锁残留。