우리는 거의 일주일 동안 매우 까다로운 문제에 직면 해 있으며 여전히 해결할 수 없습니다.IIS 응용 프로그램 풀이 예기치 않게 다운 됨
IIS에서 하루에도 여러 번 충돌하고 재활용하는 응용 프로그램 풀이 있습니다.
이벤트 뷰어에서 어떤 일이 발생했는지 모니터링했지만 오류가 상세하지 않았습니다. 윈도우 이벤트 뷰어에서이 오류의
예 (그들 사이의 이초) :
오류 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 :
이벤트 ID : 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/en-us/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 실제로 알지 못합니다 ..
그래서이 두 가지 질문을 해결할 수있는 도움이 될 것입니다. :
- 버그를 만드는 방법은 무엇입니까?
- 내 응용 프로그램 풀을 크래시하고 재활용하는 데 이러한 오류가 발생할 수 있습니까?
환경 : 은 - 8.5 IIS - 응용 프로그램 풀 CLR 버전 4 를 - 윈도우 서버 2012 R2
잠시 동안 실행 중이며 최근에 충돌이 시작 되었나요? – twoleggedhorse
오류가 발생하기 직전에 코드를 변경 했습니까? – twoleggedhorse
실제로 FtpClient를 호출하는 코드를 게시하십시오. 디버그 진단 출력이 도움이되지 않습니다. – twoleggedhorse