今天測試人員報公司的 WPF 程序啟動崩潰,下面記錄這個問題的跟蹤流程。
- 首先排除是否為發版問題,向測試要了測試環境的程序,運行奔潰,觀察日志報
System.OutOfMemoryException
; - 啟用本地 Debug 程序運行,發現內存快速增長直到進程崩潰;
- 啟動 Visual Studio 的性能跟蹤工具,跟蹤內存增長,由於進程一啟動內存就快速增長來不及做快照,故在代碼中做了啟動延時處理。拍下快照,對比內存快照,發現托管內存沒有增加,判斷為非托管內存溢出;
- 由於這是個啟動就能出現的問題,啟動代碼也不多,就嘗試注釋一些代碼來縮小問題范圍,當注釋掉 CefSharp 的初始化代碼后程序就正常了,進而判斷內存溢出出現在 CefSharp 內部;
- 回退代碼到一周前,啟動程序后問題照舊,到這時就很詭異了,因為最近這個程序我們在開發環境下都是經常運行的,從來沒出現過這個一啟動就能發現的問題,而今天一周前的代碼都出現了問題,這就排除是代碼修改造成的;
- 初步判斷是環境問題造成,這時候注意到公司的網絡不能訪問 google 了,之前公司是提供了梯子的,只要開啟自動檢測代理就能“出國”。我剛開始猜測 Cef 是 google 的嵌入式瀏覽器,難道它要訪問 google 的服務?我首先嘗試禁用網卡,程序奇跡般的正常了,雖然業務不可用,但是內存不漲了,證明它不需要訪問 google 的服務。然后我關掉代理自動檢測,程序也完全正常了。
總結一下,我沒有去搜索這個問題,因為不太好描述,只能大概猜測這個問題的原因:Cef 是嵌入的一個獨立瀏覽器進程,和我們程序進程通訊應該通過了網卡,現在公司代理有問題,導致通訊出了問題,非托管內存就溢出了。但這個問題只出現在代理故障的情況,代理正常、關閉代理甚至關閉網卡Cef都是正常的,於是猜測是不是公司代理配置出現了什么回路之類的導致程序通信消耗內存暴增。整個問題的追蹤很有意思,耗時大概兩個小時,這還需要一定經驗和靈光乍現才能想到網卡設備這個層面。