簡體   English   中英

IIS應用程序池意外崩潰

[英]IIS application pool crashing unexpectedly

現在我們已經面臨將近一個星期的棘手問題,而我們仍然無法解決。

問題是我們在IIS上有一個應用程序池,該池每天崩潰和回收幾次。

我們監視了事件查看器上發生的事情,但是錯誤沒有足夠詳細。

Windows事件查看器中的2個錯誤(它們之間2秒)的示例:

錯誤1:

Event Id : 1000

An unhandled exception occurred and the process was terminated.

Application ID: /LM/W3SVC/20/ROOT

Process ID: 14300

Exception: System.ObjectDisposedException

Message: Cannot access a disposed object.
Object name: 'System.Net.Sockets.NetworkStream'.

StackTrace:    at System.Net.Sockets.NetworkStream.Write(Byte[] buffer, Int32 offset, Int32 size)
   at System.Net.FtpClient.FtpSocketStream.Write(Byte[] buffer, Int32 offset, Int32 count)
   at System.Net.FtpClient.FtpSocketStream.WriteLine(Encoding encoding, String buf)
   at System.Net.FtpClient.FtpClient.Execute(String command)
   at System.Net.FtpClient.FtpClient.Disconnect()
   at System.Net.FtpClient.FtpClient.Dispose()
   at System.Net.FtpClient.FtpClient.Finalize()

錯誤2:

賽事編號:1325

  Faulting application name: w3wp.exe, version: 8.5.9600.16384, time stamp: 0x52157ba0
    Faulting module name: KERNELBASE.dll, version: 6.3.9600.18666, time stamp: 0x58f32841
    Exception code: 0xe0434352
    Fault offset: 0x00015608
    Faulting process id: 0x37dc
    Faulting application start time: 0x01d35b56102b1ddf
    Faulting application path: C:\windows\SysWOW64\inetsrv\w3wp.exe
    Faulting module path: C:\windows\SYSTEM32\KERNELBASE.dll
    Report Id: b9f70358-c76a-11e7-8111-0cc47a0c4e39
    Faulting package full name: 
    Faulting package-relative application ID: 

目前,我們能夠找到導致應用程序池崩潰的錯誤。 它涉及從FtpClient庫訪問已處置的對象。 但是我們仍然無法找到代碼中正在執行此調用的內容。

然后,我們決定安裝DebugDiag( https://www.microsoft.com/zh-cn/download/details.aspx?id=49924 )。 順便說一句非常強大的工具。 我們啟動了DebugDiag來監視應用程序池崩潰,並能夠生成非常詳細的報告(.mhtml格式)。

這是完整的調用堆棧: .NET調用堆棧

[[HelperMethodFrame]] 
System_ni!System.Net.Sockets.NetworkStream.Write(Byte[], Int32, Int32)+673bde 
System.Net.FtpClient.FtpSocketStream.Write(Byte[], Int32, Int32)+33 
System.Net.FtpClient.FtpSocketStream.WriteLine(System.Text.Encoding, System.String)+44 
System.Net.FtpClient.FtpClient.Execute(System.String)+1c6 
System.Net.FtpClient.FtpClient.Disconnect()+57 
System.Net.FtpClient.FtpClient.Dispose()+46 
System.Net.FtpClient.FtpClient.Finalize()+10 
[[DebuggerU2MCatchHandlerFrame]] 
[[ContextTransitionFrame]] 
[[GCFrame]] 
[[DebuggerU2MCatchHandlerFrame]] 

完整通話堆棧

KERNELBASE!RaiseException+48 
clr!RaiseTheExceptionInternalOnly+27c 
clr!IL_Throw+141 
[[HelperMethodFrame]] 
System_ni!System.Net.Sockets.NetworkStream.Write(Byte[], Int32, Int32)+673bde 
System.Net.FtpClient.FtpSocketStream.Write(Byte[], Int32, Int32)+33 
System.Net.FtpClient.FtpSocketStream.Write(Byte[], Int32, Int32)+33 
System.Net.FtpClient.FtpSocketStream.WriteLine(System.Text.Encoding, System.String)+44 
System.Net.FtpClient.FtpSocketStream.WriteLine(System.Text.Encoding, System.String)+44 
System.Net.FtpClient.FtpClient.Execute(System.String)+1c6 
System.Net.FtpClient.FtpClient.Disconnect()+57 
System.Net.FtpClient.FtpClient.Dispose()+46 
System.Net.FtpClient.FtpClient.Finalize()+10 
clr!MethodTable::FastBox+b0 
clr!MethodTable::CallFinalizer+139 
clr!CallFinalizer+a6 
clr!FinalizerThread::FinalizeAllObjects+a6 
clr!FinalizerThread::FinalizeAllObjects_Wrapper+14 
clr!Thread::DoExtraWorkForFinalizer+1b1 
clr!Thread::DoExtraWorkForFinalizer+234 
clr!Thread::DoExtraWorkForFinalizer+5f8 
[[DebuggerU2MCatchHandlerFrame]] 
clr!Thread::DoExtraWorkForFinalizer+137 
clr!Thread::DoADCallBack+30f 
[[ContextTransitionFrame]] 
clr!Thread::DoExtraWorkForFinalizer+19f 
clr!FinalizerThread::DoOneFinalization+129 
[[GCFrame]] 
clr!FinalizerThread::FinalizeAllObjects+a6 
clr!FinalizerThread::FinalizerThreadWorker+ed 
clr!Thread::DoExtraWorkForFinalizer+1b1 
clr!Thread::DoExtraWorkForFinalizer+234 
clr!Thread::DoExtraWorkForFinalizer+5f8 
[[DebuggerU2MCatchHandlerFrame]] 
clr!ManagedThreadBase::FinalizerBase+33 
clr!FinalizerThread::FinalizerThreadStart+d4 
clr!Thread::intermediateThreadProc+55 
kernel32!BaseThreadInitThunk+24 
ntdll!__RtlUserThreadStart+2f 
ntdll!_RtlUserThreadStart+1b 

我們能夠找到導致池崩潰的異常,但仍無法找到代碼的哪一部分正在執行調用。 在調用堆棧的底部,您會注意到第一個事件是:ntdll!_RtlUserThreadStart + 1b,我真的不知道..

因此,很高興能為您解決這兩個問題提供幫助:

  • 如何在我的代碼中找到造成此錯誤的原因?
  • 這種錯誤如何導致我的應用程序池崩潰和回收?

環境:-IIS 8.5-應用程序池CLR版本4-Windows Server 2012 R2

消息Cannot access a disposed object表示垃圾收集器已處置了您的對象,然后您嘗試使用該對象。

您是否正在using調用FtpClient,是否正在執行.close()

錯誤日志實際上並沒有用,如果您發布代碼則更好。

另外,將代碼放在try...catch這樣您就可以捕獲錯誤而不是不處理。 有時文件傳輸失敗,因此您需要執行以下操作:

try { 
    using(Stream s = ftpClient.OpenRead()) { 
    // perform your transfer 
    } 
} 
catch(Exception) {
 // Typical exceptions here are IOException, SocketException, or a FtpCommandException 
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM