環境
Windows 2012 R2, IIS, NPOI v2.1.1.0
.net 3.x , 應用程式集區為 32 位元
問題
最近同事在一台 Windows 2012 R2 上安裝系統,把 8 個 iis 的應用程式放在同一個應用程式集區之中。
其中一個應用程式中,有使用到 NOPI 去產生 Excel 報表。
那個報表是依 DataTable 將資料 Loop 放到 Excel 之中,但神奇的是,程式在執行到一半,卻會讓那個應用程式集區直接重啟。
而事件檢視器之中就只有「失敗的應用程式名稱: w3wp.exe,版本: 8.5.9600.16384,時間戳記: 0x52157ba0」的錯誤,如下,
研究
因為是 w3wp.exe 直接重啟,所以就透過 Debug Diagnostic Tool來收集 IIS 的 Crash 資料,所以先透過 DebugDiag 2 Collection 來收集發生錯誤時,將 Stack Trace Log 起來,如下,
最後發現,應用程式集區重啟後,的確產生 2 個不同 Process 的 Log 檔,如下,
查看最後的 Log 是掛在 NPOI 的 NPOI.HSSF.UserModel.HSSFRow.get_Cells ,如下,
0e5fd908 759c89f2 [HelperMethodFrame_PROTECTOBJ: 0e5fd908] System.Delegate.DelegateConstruct(System.Object, IntPtr)
0e5fdaf0 67511c77 System.Collections.Generic.SortedDictionary2+ValueCollection[[System.Int32, mscorlib],[System.__Canon, mscorlib]].CopyTo(System.__Canon[], Int32) 0e5fdb18 6f537a25 System.Collections.Generic.List
1[[System.__Canon, mscorlib]]..ctor(System.Collections.Generic.IEnumerable`1<System.__Canon>)
0e5fdb50 1ce64bbe NPOI.HSSF.UserModel.HSSFRow.get_Cells()
0e5fdb60 1ce64a91 NPOI.HSSF.UserModel.HSSFSheet.NotifyRowShifting(NPOI.HSSF.UserModel.HSSFRow)
0e5fdba8 1ce64016 NPOI.HSSF.UserModel.HSSFSheet.ShiftRows(Int32, Int32, Int32, Boolean, Boolean, Boolean)
0e5fdc38 1ce63f14 NPOI.HSSF.UserModel.HSSFSheet.ShiftRows(Int32, Int32, Int32)
0e5fdc44 1ce628e2 NPOI.SS.Util.SheetUtil.CopyRow(NPOI.SS.UserModel.ISheet, Int32, Int32)
0e5fdc70 1ce6281a NPOI.HSSF.UserModel.HSSFSheet.CopyRow(Int32, Int32)
如果將錯誤改成 dump 檔的話,然後再透過 DebugDiag Analysis 來分析,主要錯誤如下,
ntdll!NtWaitForSingleObject+c
KERNELBASE!WaitForSingleObjectEx+99
mscorwks!CLREventWaitHelper+2f
mscorwks!CLREvent::WaitEx+117
mscorwks!CLREvent::Wait+17
mscorwks!ThreadpoolMgr::SafeWait+73
mscorwks!ThreadpoolMgr::WorkerThreadStart+11c
mscorwks!Thread::intermediateThreadProc+49
kernel32!BaseThreadInitThunk+24
ntdll!__RtlUserThreadStart+2f
ntdll!_RtlUserThreadStart+1b
而它的錯誤點,就指到了上述 NPOI 的錯誤。
在沒什麼想法時,想說將那個有錯誤的應用程式,放到一個單獨使用的應用程式集區之中,比較好分析。
於是將它放過去之後,錯誤也隨之不見了。
再將它放在一起,錯誤又出現了。 @_@
解法
新增一個新的應用程式集區,然後讓那個會出錯的應用程式使用,再測試一次程式,居然就不會有問題了。
或許也可以更新 NPOI 版本到較新的版本試看看。
大家有其他的想法嗎? 歡迎提供出來討論哦 :)
- 2019/06/20 Update
- 有同事也遇到一樣的問題,但如果將 Application Pool 改成 x64 的話,就沒有問題。
參考資料
How to Troubleshoot an ASP.NET Crash & Analyze w3wp Crash Dumps