天天看點

分析解決Windows 11之事件日志服務無法啟動

這兩天有使用者回報,其制作的Windows 11 22H2鏡像,啟動後事件日志檢視器無法打開,在"服務"管理中檢視"Windows event log"服務是停止狀态,啟動"Windows event log"服務提示1067錯誤,也即"程式意外結束",這真是少有的現象,事件日志服務很重要,對排查計算機軟硬體相關問題特别有用,沒想到本次碰到了無法通過事件檢視器檢視事件日志服務無法啟動的問題,笑哭!

事件日志服務是由宿主程式svchost.exe啟動的,先用黑盒方法觀察一下。微軟Sysinternals提供了工具Process Monitor,其強大功能之一就是能檢視調用堆棧,拿它來看程序崩潰到哪裡了。通過在Windows error reporting程序被拉起前的一個程序事件堆棧可見事件日志服務崩潰在了wevtsvc.dll的0x30910處:

分析解決Windows 11之事件日志服務無法啟動

崩潰在wevtsvc.dll的0x30910處

由于使用者說早前Windows 10上沒有此類現象,是以産生了一個暴力的想法,把Windows 10版本的wevtsvc.dll替換到Windows 11上面,經測試,一次成功!

雖然解決,但感覺Windows 11上使用Windows 10的dll還是有點不純粹。于是打開Windbg,搞起雙機調試環境後,原本還想通過一步步設斷跟蹤到svchost加載wevtsvc.dll,結果一啟動事件日志服務,Windbg就捕獲到崩潰,很爽,直接kb看堆棧吧:

分析解決Windows 11之事件日志服務無法啟動

Windbg顯示的事件日志服務崩潰堆棧

可見服務崩潰在wevtsvc.dll的OSEventsWriteTimestamp函數處,看函數名意思是與寫OS事件相關的時間戳有關,0x30910崩潰處指令是div ecx。由于是靜态分析,看看調用和被調用函數吧,結果發現函數OsEventsTimestampInterval調用到系統資料庫,與時間戳相關:

分析解決Windows 11之事件日志服務無法啟動

與時間戳相關的操作

是以又産生一個暴力想法(對,為快速解決問題,用暴力的),直接删除相關的系統資料庫項特别是TimestampEnabled和TimestampInterval是否可以呢?

随即打開系統資料庫,删除HKEY\LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Reliability下系統資料庫,看系統資料庫項名稱似乎與關機機制相關:

分析解決Windows 11之事件日志服務無法啟動

Reliability系統資料庫内容

删除系統資料庫後,立竿見影,事件日志服務可正常啟動了,點選事件日志檢視器檢視系統日志,也可正常展示。

到此,問題得到相對完美的解決。不過很難說到底是Windows 11的bug還是鏡像制作産生的問題,因為據回報正常硬碟安裝的Windows 11沒有這個問題。有時間再更進一步深入啦,随手查了一下TimeStampInterval和TimeStampEnabled的相關資訊,網際網路如此博大,還真有這兩個值的解釋,它是一個Windows政策,注解放在這裡友善大家看:

啟用永久性時間戳

使用此政策設定,可根據由Timestamp Interval控制的計劃,通過将目前時間寫入磁盤來允許系統檢測意外關機的時間。
如果啟用此政策設定,則可指定"永久性系統時間戳"的重新整理頻率以及随後寫入磁盤的頻率。可以指定"時間戳間隔"(以秒為機關)。
如果禁用此政策設定,則會關閉"永久性系統時間戳",且不記錄意外關機的時間。
如果未配置此政策設定,則會依照預設設定(從 Windows Server 2003 開始為每 60 秒重新整理一次)重新整理"永久性系統時間戳"。
注意: 此功能可能與電源配置設定(處于非活動狀态一段時間後,關閉硬碟)沖突。可以在"控制台"的"電源選項"中通路這些電源設定。           
分析解決Windows 11之事件日志服務無法啟動

TimestampEnabled和TimestampInterval系統資料庫項取值

也有稱之為Windows系統的心跳設定,它每隔一個TimestampInterval記錄下時間戳,可以用來推測藍屏或拔電等意外關機的大概時間,準确度依賴設定的TimestampInterval的精度了。

繼續閱讀