如何調試 w3wp.exe 隨機崩潰的原因?
在主生產伺服器上,IIS 工作程序有時會崩潰。從事件查看器中,我得到以下資訊。
錯誤應用程序名稱:w3wp.exe,版本:7.5.7601.17514,時間戳:0x4ce7a5f8 錯誤模組名稱:KERNELBASE.dll,版本:6.1.7601.17651,時間戳:0x4e211319 異常程式碼:0xe053534f 錯誤偏移:0x0000b9bc 錯誤程序 id:0%x 9 錯誤應用程序啟動時間:0x%10 錯誤應用程序路徑:%11 錯誤模組路徑:%12 報告 ID:%13
這在產品伺服器上隨機發生,我無法在其他任何地方重新創建此崩潰。這發生在 IIS 6 上,我們最近遷移到 Windows Server 2008 和 IIS 7.5,崩潰也發生在那裡。
如何去尋找這個的根本原因?
Tess Ferrandez 的部落格中包含分步指南:
https://blogs.msdn.com/b/tess/archive/2009/03/20/debugging-a-net-crash-with-rules-in-debug-diag.aspx
本質上,您將設置 DebugDiag 1.2 x64 以觸發該異常程式碼,並創建一個完整的使用者轉儲。創建轉儲後,您可以使用 DebugDiag 為您分析轉儲。儘管有那個特殊的例外,您可能需要使用 WinDbg+SOS。
一些更相關的資訊:
“對於你們大多數人可能知道的堆棧溢出,最常見的原因是我們處於某種類型的遞歸循環中,所以我們真正想知道的是這個堆棧上的內容……它出現的原因是只是地址而不是方法名稱,因為調試診斷不理解 .net,所以我們必須將轉儲帶到 windbg 來分析它並檢查 .net 堆棧。
“在 windbg 中,我們可以載入 sos ( .loadby sos mscorwks ) 並在活動堆棧上執行 !clrstack 以獲取呼叫堆棧。”
(如果您執行的是 .NET 4,載入 sos 的命令是: .loadby sos clr)
最終,您要查找的是應用程序中導致遞歸的違規程式碼。載入 SOS 時出現在 WinDbg 中的方法名稱可能會讓您指向正確的方向。