Event ID: 1023(.NET Runtime Error)
Event ID: 1000(Application Error)
程式已經停止運作
昨天客戶諮詢一個日常作業Batch console出現程式已經停止運作的錯誤,一開始的訊息不太充足,後來再請客戶提供Windows Event log後有點眉目:
如果沒有伺服器管理/電腦管理的權限(compmgmt),可以用以下方式開啟eventlog:
1.按一下開始,輸入eventvwr.msc執行事件檢視器:
2.然後檢查windows紀錄下的應用程式及系統是否有等級為錯誤的訊息。
(環境資訊: Windows Server 2008 R2 + .NET Framework 4.0)
錯誤訊息
果不其所然,在程式發生問題當時,在應用程式分類下,windows event log也紀錄下兩個錯誤log:
等級 | 來源 | 事件識別碼 |
錯誤 | Application Error | 1000 |
錯誤 | .NET Runtime | 1023 |
透過event id查kb,發現可能和GC回收有關
https://support.microsoft.com/en-us/kb/2640103
.NET Runtime中的錯誤訊息內容:
The process was terminated due to an internal error in the .NET Runtime at IP 6B484BC2 (6B300000) with exit code 80131506.
問題原因
The issue occurs because an object that is being referenced is dereferenced by the garbage collector in common language runtime 4 (CLR4).
Therefore, an access violation occurs during garbage collection or when the application tries to access the released object.
簡單的說,就是本來把從資料庫中的資料集合放到物件中,接著想要參考時卻發生物件已經被GC掉了,有可能的原因是執行當時的記憶體不足而觸發GC
(前面這句是自己OS,後續再請sp幫忙給記憶體使用追蹤來調查)。
小結:
- 先請客戶apply這隻hotfix到testing,觀察正常後上線。(上線5年後,第一次遇到)
- 如果Os環境是.NET 4.5,如果apply hotfix後沒效果,可能要先移除.NET4.5再apply KB,最後安裝回.NET 4.5。
- KB2640103
參考:
https://support.microsoft.com/en-us/kb/2640103
.NET 4.5: internal error in the .NET Runtime (80131506) / disabling concurrent GC