印象最深的一個bug——排查修復問題事件BEX引發的谷歌瀏覽器閃退崩潰異常

攻城獅Chova發表於2021-11-05

前言

  • 最近,我們部門負責專案運維的小王頻頻接到甲方的反饋,執行的專案使用谷歌瀏覽器登入後,每次點選處理2秒後,瀏覽器自動閃退崩潰.小王同學折騰了一個星期,還沒找到問題的原因.甲方客戶都把問題反饋給專案經理了.專案經理給小王撂下狠話,“明天客戶再給我打電話,你以後再也沒機會穿拖鞋上班了..”
  • 小王擾了擾頭上剩在中間的頭髮,一臉委屈的看向我,無奈中透著一點深情
  • “Chova大哥哥,你來幫我看看嘛~以後晚上陪你一起健身!”
  • 看著他期待的目光,我心目不免一緊,哆哆嗦嗦地開啟了他電腦上的谷歌瀏覽器...

問題一:問題事件BEX瀏覽器停止工作

  • 點選專案中問題處置頁面跳轉後,游標出現轉圈 ,2秒後彈框提示Google Chrome已停止工作
    在這裡插入圖片描述

原因

  • 軟體中dll檔案和瀏覽器發生衝突

解決

刪除造成衝突的dll檔案

  • 點選檢視問題詳細資訊,檢視瀏覽器崩潰的問題簽名
問題簽名:
  問題事件名稱:  BEX
  應用程式名:  chrome.exe
  應用程式版本:  69.0.3497.100
  應用程式時間戳:  5b9cbd4f
  故障模組名稱:  BrowserUrl.dll
  故障模組版本:  0.0.0.0
  故障模組時間戳:  5f4b9830
  異常偏移:  00004138
  異常程式碼:  c0000409
  異常資料:  00000000
  OS 版本:  6.1.7601.2.1.0.256.48
  區域設定 ID:  2052
  其他資訊 1:  031a
  其他資訊 2:  031ac9a5aca2c7bab1c2347d68169e05
  其他資訊 3:  e951
  其他資訊 4:  e951aede12191034f862a087b85a801a
  • 問題簽名中的故障模組名稱就是造成瀏覽器崩潰的dll檔案
  • 通過在瀏覽器導航欄中輸入以下路徑檢視載入的dll檔案位置:
chrome://conflicts/
  • 將原來的dll備份到其餘資料夾,用於後續恢復
  • 在軟體資料夾中刪除軟體中造成衝突的dll檔案

修復造成衝突的軟體

  • 刪除造成衝突的dll檔案只是暫時解決瀏覽器停止工作的問題
  • 因為dll檔案時軟體的執行依賴,如果隨便刪除會導致軟體本身執行異常
  • 如果想要徹底解決BEX問題事件,需要修復造成衝突的軟體,大部分是軟體本身存在問題,建議下載官方軟體

問題二:谷歌瀏覽器閃退

  • 點選專案中問題處置頁面跳轉後,游標出現轉圈 ,2秒後瀏覽器閃退消失
  • 專案部署在同一個伺服器上,使用不同的計算機進行測試,問題只是在部分計算機中出現

原因

  • 由於問題僅在部分電腦上出現,初步判定不是專案的問題,從系統方向排查問題
  • 對無問題計算機和問題計算機,初步判定為問題計算機中的安全策略配置導致瀏覽器訪問發生閃退崩潰的問題

解決

刪除安全策略

  • 進入控制皮膚點選使用者賬戶檢視當前使用者為是否為管理員賬戶
  • 進入C盤修改策略檔案彈出框提示需要管理員許可權
  • 開啟執行輸入gpedit.msc開啟本地策略組
  • 進入到本地策略組中的使用者賬戶控制以管理員批准模式控制其餘賬戶
  • 禁用使用者賬戶控制, 重啟計算機
  • 開機後進入C盤直接刪除操作檔案

增加使用者許可權

  • 在系統中的賬戶中檢視當前使用者賬戶
  • 點選此電腦,選擇屬性中的安全選項卡,選中高階
  • 更改當前使用者賬戶所有者並替換子容器物件的所有者
  • 許可權中新增當前使用者賬戶完全控制許可權繼承

問題三:錯誤碼STATUS_INVALID_IMAGE_HASH瀏覽器崩潰

  • 谷歌瀏覽器崩潰,錯誤碼為STATUS_INVALID_IMAGE_HASH
  • 谷歌瀏覽器外掛報錯,並彈出錯誤提示框

原因

  • Google Chrome79版本中重新啟用了渲染器程式碼完整性保護Renderer Code Integrity Protection. 這個會導致簽名不是谷歌或者微軟的模組被阻止載入

解決

禁用渲染器程式碼完整性保護功能

  • 通過檔案禁用渲染器程式碼完整性保護功能 (推薦) :
      - 開啟執行輸入regedit進入登錄檔編輯器
      - 進入資料夾 HKEY_LOCAL_MACHINE \ SOFTWARE \ Policies \ Google \ Chrome
      - 在右側的視窗中,右鍵單擊新建, 選擇DWORD(32位)值建立新的金鑰
      - 雙擊新建的金鑰,將值名稱修改為RendererCodeIntegrityEnabled, 並將值資料輸入為0
      - 重啟谷歌瀏覽器
  • 使用命令禁用渲染器程式碼完整性保護功能:
      - 開啟執行,輸入以下命令可以禁用渲染器程式碼完整性保護功能,其餘功能禁用方式類似
      shell   chrome.exe --disable-features=RendererCodeIntegrity  

總結

Windows檢查事件日誌

  • 右鍵開始圖示,開啟事件檢視器
  • 點選應用程式和服務, 進入Microsoft => Windows => CodeIntegrity => 可操作
  • 查詢問題事件ID為3033的事件
  • 點選問題事件的詳細資訊,會顯示導致瀏覽器崩潰的dll檔案的名稱和位置

Google Chrome顯示模組載入列表

  • 在導航欄輸入以下路徑,可以顯示載入的各個模組的資訊:
chrome://conflicts/

在這裡插入圖片描述

一點思考

  • 這個BUG是我目前修復的千千萬萬個專案的BUG中印象最深的一次BUG,由於問題事件BEX引發的谷歌瀏覽器閃退崩潰的異常問題.這個BUG因為其不可復現性導致特別難以發現和解決,正是由於這一次的BUG解決過程,讓我瞭解到了一位攻城獅在專案開發維護過程中實際經驗的重要性,多思考,多實踐,多多積累經驗,才是一位攻城獅的成長之路.

相關文章