2017-11-12 39 views
0

우리는 거의 일주일 동안 매우 까다로운 문제에 직면 해 있으며 여전히 해결할 수 없습니다.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

+0

잠시 동안 실행 중이며 최근에 충돌이 시작 되었나요? – twoleggedhorse

+0

오류가 발생하기 직전에 코드를 변경 했습니까? – twoleggedhorse

+0

실제로 FtpClient를 호출하는 코드를 게시하십시오. 디버그 진단 출력이 도움이되지 않습니다. – twoleggedhorse

답변

0

메시지 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 
}