深入解析系统崩溃排查:从蓝屏到驱动配置的故障追踪

本文详细记录了作者在Windows系统频繁蓝屏崩溃时的排查过程,涉及内存转储失败分析、ETW事件追踪、Intel系统驱动配置解析及服务注册表调试,揭示了驱动配置标志与系统稳定性间的潜在关联。

系统崩溃故障排查

某天我的系统开始频繁崩溃。每天出现多次蓝屏,伴随多种错误代码。最糟糕的是——尽管系统已配置为收集完整内存转储,但每次崩溃时均未生成任何转储文件(甚至迷你转储也没有)。由于无法分析这些文件,我难以定位根本问题。

在放弃并重装系统前,我决定查看事件查看器以寻找线索。首先检查了“Windows日志”下的应用程序和系统日志,但除了通用事件(仅告知系统崩溃且转储文件写入失败)外一无所获——这些信息我早已掌握。

于是转向其他ETW事件,期望能找到有用信息。最终在一个意外的地方发现了线索——Microsoft-Windows-Hyper-V-Hypervisor通道:

1
2
Hypervisor launch failed; MSR 0x1F1 is 0x10, expected 0x0. 
If the hypervisor is not required, disable it using the 'bcdedit' command line.

这条信息本身并未提供太多内容,也无法直接证明是崩溃原因,但这是目前发现的唯一异常,至少是个起点。

接下来分析相关驱动。这是“Intel System Usage Report”驱动,关于其功能或用途的信息极少。该驱动创建了同名设备,因此使用System Informer搜索功能可轻松找到使用该驱动的进程:

1
esrv_svc.exe

该进程通过ESRV_SVC_QUEENCREEK服务运行,描述为“Intel(r) Energy Checker SDK. ESRV Service queencreek”。查看服务启动时执行的镜像路径,发现一个异常路径:

1
"C:\Program Files\Intel\SUR\QUEENCREEK\x64\esrv_svc.exe" "--AUTO_START" "--start" "--start_options_registry_key" "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\ESRV_SVC_QUEENCREEK\_start"

自然,下一步是查看该命令引用的服务注册表项:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
_start注册表值是一个长命令,无法在regedit中完整显示。因此从命令行使用reg query导出

reg query HKLM\SYSTEM\CurrentControlSet\Services\ESRV_SVC_QUEENCREEK

Type                REG_DWORD        0x10
Start               REG_DWORD        0x2
ErrorControl        REG_DWORD        0x1
ImagePath           REG_EXPAND_SZ    "C:\Program Files\Intel\SUR\QUEENCREEK\x64\esrv_svc.exe" "--AUTO_START" "--start" "--start_options_registry_key" "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\ESRV_SVC_QUEENCREEK\_start"
DisplayName         REG_SZ           Energy Server Service queencreek
ObjectName          REG_SZ           LocalSystem
_start              REG_EXPAND_SZ    "--START" "--output_folder" "%LOCAL_APP_DATA%\Intel\SUR\QUEENCREEK\collected_data" "--depend_on_key" "SOFTWARE\Intel\SUR\ICIP_RUN" "--depend_on_folder" "%LOCAL_APP_DATA%\Intel\SUR\QUEENCREEK\intermediate_data" "--depend_on_folder_size_less_than" "262144000" "--depend_on_folder_files_count_less_than" "300" "--depend_on_folder_depth_less_than" "20" "--depend_on_folder_scan_time_less_than" "40000" "--depend_check_period" "3600000" "--address" "127.0.0.1" "--port" "49350" "--do_not_generate_dump_files" "--time_in_ms" "--pause" "5000" "--watchdog" "5" "--watchdog_cpu_usage_limit" "50" "--end_on_error" "--priority_boost" "--kernel_priority_boost" "--shutdown_priority_boost" "--do_not_use_system_error_logs" "--library" "C:\Program Files\Intel\SUR\QUEENCREEK\x64\intel_modeler.dll" "--no_pl" "--resume_delay" "30000" "--device_options" " time=no  generate_key_file=no performance=no in_cycle_performance=no output=w output_folder='%LOCAL_APP_DATA%\Intel\SUR\QUEENCREEK\intermediate_data' upload_folder='%LOCAL_APP_DATA%\Intel\SUR\QUEENCREEK\collected_data' lock_xls=yes deferred_logger_stop=yes il='C:\Program Files\Intel\SUR\QUEENCREEK\x64\intel_acpi_battery_input.dll','start_at=6' il='C:\Program Files\Intel\SUR\QUEENCREEK\x64\intel_wifi_input.dll' il='C:\Program Files\Intel\SUR\QUEENCREEK\x64\devices_use_input.dll','service=yes enumerate_pid=yes' il='C:\Program Files\Intel\SUR\QUEENCREEK\x64\intel_system_power_state_input.dll','numsamples_to_buffer=6 clock=5000 delayed_resume=30000' il='C:\Program Files\Intel\SUR\QUEENCREEK\x64\intel_os_input.dll','clock=5000 threads=auto configuration_file=C:\Program Files\Intel\SUR\QUEENCREEK\x64\sur_os_counters.txt optimize=yes auto_min_tick=10 auto_tick_gap=5' il='C:\Program Files\Intel\SUR\QUEENCREEK\x64\intel_phat_input.dll','delay=1000 always_log_phat_metadata=YES extract_phat_on_new_boot_only=YES' il='C:\Program Files\Intel\SUR\QUEENCREEK\x64\intel_process_input.dll','configuration_file=C:\Program Files\Intel\SUR\QUEENCREEK\x64\process_input_options.txt' il='C:\Program Files\Intel\SUR\QUEENCREEK\x64\intel_hw_input.dll','configuration_file=C:\Program Files\Intel\SUR\QUEENCREEK\x64\sur_hw_config.txt' il='C:\Program Files\Intel\SUR\QUEENCREEK\x64\intel_etw_input.dll','configuration_file=C:\Program Files\Intel\SUR\QUEENCREEK\x64\etw_options_config.txt' il='C:\Program Files\Intel\SUR\QUEENCREEK\x64\intel_crashlog_input.dll','start_at=12 nogpr_cpusig_count=3 read_sampling_count_max=200 configuration_file=C:\Program Files\Intel\SUR\QUEENCREEK\x64\crashlog_options.txt ' il='C:\Program Files\Intel\SUR\QUEENCREEK\x64\intel_fps_input.dll','clock=5000' il='C:\Program Files\Intel\SUR\QUEENCREEK\x64\intel_heartbeat_input.dll','service=yes' il='C:\Program Files\Intel\SUR\QUEENCREEK\x64\intel_csme_input.dll','start_at=8' il='C:\Program Files\Intel\SUR\QUEENCREEK\x64\intel_process_watcher_input.dll','override=yes configure=yes generate_samples=yes enumeration=no enumeration_delay=10000 enumeration_pause=250' ll='C:\Program Files\Intel\SUR\QUEENCREEK\x64\sql_logger.dll','db_differential_elaspsed_time=yes db_wal=yes db_wal_autocheckpoint=0 db_cache=yes db_cache_size=auto db_max_page_count=300000 db_synchronous=off db_journal_mode=off db_locking_mode=exclusive+ delayed_dctl=summarize dctl_process_delay=5000' "
DelayedAutostart    REG_DWORD          0x1
description         REG_SZ            Intel(r) Energy Checker SDK. ESRV Service queencreek
run                 REG_DWORD          0x1

该命令行包含大量DLL路径和配置选项。其中存在一些有趣的持久化选项(需要管理员权限)——将命令中的任意DLL替换为自定义DLL,即可在服务启动时执行代码。该服务还使用了一些在安装、更新和卸载时执行的批处理和VBS文件,这些文件也提供了其他持久化选项,但同样需要管理员权限。

但与系统崩溃相关的部分是配置标志。首先,do_not_generate_dump_files标志可能导致系统崩溃后缺少转储文件。其次,--watchdog_cpu_usage_limit 50标志可能在CPU使用率过高时触发系统崩溃。

为尝试解决问题,我禁用了该服务及其所有相关服务。这确实减少了系统崩溃频率,但未完全消除崩溃,表明这只是问题的一部分。转储文件生成仍未恢复,因此我的猜测有误(后来我了解到可能是securekernel.exe的bug导致该问题)。

此次调查并未得出完全满意的解决方案,因为我尚未找到彻底解决重复崩溃或内存转储缺失的方法。但我认为研究过程本身值得发布,希望能帮助到其他人。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计