Skip to content

[Bug] explorer.exe 在休眠恢复时崩溃 (shell.dll ACCESS_VIOLATION) #360

@Yihe-ng

Description

@Yihe-ng

环境

  • OS: Windows 11 25H2 (10.0.26200)
  • Explorer 版本: 10.0.26100.8457(组件版本仍为 24H2)
  • Breeze Shell: 0.1.34
  • 已启用插件: 右键菜单清理、常用功能小图标
  • 主题: 亚克力效果开启 (acrylic: true)

复现步骤

  1. 正常使用电脑,breeze-shell 运行正常
  2. 合盖(或手动)使系统进入休眠 (Hibernate / S4)
  3. 等待数小时
  4. 唤醒系统
  5. explorer.exe 崩溃,任务栏消失后自动重启

正常重启/冷启动不会触发,仅休眠恢复时复现。

实际行为

explorer.exe 崩溃,任务栏消失,随后自动重启(explorer 恢复后 breeze-shell 重新注入,当前 session 恢复正常)。

期望行为

休眠恢复后 explorer.exe 正常运行。

崩溃详情

来源:Windows 事件查看器 → Application 日志

两次 ACCESS_VIOLATION,间隔约 21 秒(explorer 自动重启后再次崩溃):

# 时间 (UTC) 故障模块 异常码 偏移
1 2026-06-02 21:03:29 shell.dll 0xc0000005 0x4859c4
2 2026-06-02 21:03:50 shell.dll 0xc0000005 0x4971ee

注:UTC 时间对应北京时间 05:03,实际唤醒时间为 09:57。休眠唤醒时系统时钟尚未从 RTC 同步,事件时间戳存在偏差(内核时间同步日志显示时钟跳变 +10.86h)。

Report ID:

  • e0ae01e8-10e6-4ff9-a820-fc36391fd87b
  • 04ea7906-1e3d-4377-b42c-4f00820ba924

连锁反应:同时间段 explorer.exe + ucrtbase.dll 崩溃 5 次(0xc0000409 stack buffer overrun),疑似 shell.dll 注入导致的二次效应。

历史崩溃记录

crash_report.txt(v0.1.32, commit 50701ff)记录了同样的 0xc0000005

Exception code: c0000005 (ACCESS_VIOLATION)
Exception address: 0x7FF84E6B6DC0
Stack trace 含 RegisterProcTableCallback(DWM/DirectComposition 层)

电源事件时间线

时间(本地) 事件
6月2日 23:05 合盖 → 进入休眠 (Button or Lid)
6月3日 05:03* explorer.exe 崩溃 ×2(shell.dll)
6月3日 09:57 从休眠唤醒 (Resume from Hibernate)
6月3日 09:57 内核时间同步:系统时钟从 23:05 跳至 09:57(+10.86h)

*时间戳因唤醒时系统时钟未校正而偏移,实际崩溃发生于唤醒瞬间。

初步分析

崩溃发生在休眠恢复、系统时钟校正之前的窗口。推测根因:休眠恢复时 explorer.exe 初始化顺序与冷启动不同,DWM 合成器尚未完全重建时 shell.dll 已尝试:

  1. 通过 IShellBrowser 获取文件夹接口
  2. 初始化亚克力渲染 surface(acrylic: true

拿到无效句柄/指针后解引用导致 ACCESS_VIOLATION。

两个崩溃点偏移不同(0x4859c4 vs 0x4971ee),指向状态依赖问题而非固定逻辑 bug。

建议排查方向

  • 监听 PBT_APMRESUMEAUTOMATIC 电源事件,延迟菜单初始化至 DWM 完全恢复
  • 可尝试临时 workaround:关闭亚克力 (acrylic: false)

此 issue 由 DeepSeek 辅助分析和撰写。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions