2010-12-15 3 views
6

응용 프로그램이 충돌 할 때 예외 또는 다른 종류의 메시지를주지 않는 충돌하는 .NET 2.0 응용 프로그램이 있습니다. Application.ThreadException 이벤트를 잡기 때문에 충돌 할 때 아무것도 수신되지 않습니다. 며칠 후에 응용 프로그램이 사라졌습니다! Windows 이벤트 로그에 덤프 파일이 없거나 어떤 메시지도 표시되지 않습니다. 여러 대의 PC에서 응용 프로그램을 실행하려고했지만 몇일이 지나면 문제가 나타납니다.예외없이 예기치 않은 .net 응용 프로그램 충돌이 발생합니다.

응용 프로그램이 TCP/IP 연결을 통해 다른 PC와 통신 중이며 모든 데이터가 항상 유효하며 연결이 끊어 지거나 연결되지 않습니다. 디스크 공간 또한 문제없이 충돌 할 때도 충분한 메모리가 있습니다. .NET 4.0으로 업그레이드 할 수있는 옵션이 없습니다.

응용 프로그램 windbg를 실행중인이 순간

, 그래서 난이 어떤 정보를 줄 바랍니다 ..

이 어떤 경험을 가지고, 또는 몇 가지 유용한 팁이나 도구가 있으면 알려주세요!

답변

2

.Net 응용 프로그램이 갑자기 오류 메시지없이 종료되거나 처리되지 않은 예외 처리기가 실행되면 응용 프로그램에서 스택 오버플로가 발생할 가능성이 큽니다. 이렇게하면 많은 경우 핸들러를 실행하지 않고 프로세스를 신속하게 종료합니다.

+0

이벤트 로그에 어떤 종류의 추적 또는 어떤 것을 얻을 수있는 방법이 없습니까? 심지어 "죽었어"? –

+1

@ 존, 이벤트 로그에 나타나야하지만 "스택 오버플로"라고만 표시됩니다. 나는 WinDbg가 VS보다 일반적으로 더 좋음을 발견했다. 디버깅하는 동안 VS가 갑자기 종료 될 가능성이있는 동안 스택을 볼 수있는 기회를 제공한다. – JaredPar

+0

나는 이벤트 로그에서 어떤 것을 기대했지만, OP는 아무 것도 없다고 말했다. 어떤 이벤트 소스, ID 및 로그가 사용됩니까? –

2

시도 AppDomain.UnhandledException. Application.ThreadException은 UI 스레드에서 예외가 발생하는 경우에만 발생합니다.

3

TCP/IP를 사용하는 경우 스레드를 사용하는 것이 좋습니다. 스레드가 EndXxxx()를 호출 할 때 매우 일반적인 처리되지 않은 예외로 종료되면 응용 프로그램이 종료됩니다. 컴퓨터에서 Windows 오류보고가 꺼져 있거나 서버에서 흔히 발생하는 경우가 아니라면이 메시지가 표시되지 않을 수 있습니다. 갑자기 연결이 끊어 지거나 강제로 닫힌 연결을 처리 할 수 ​​있도록 적어도 ObjectDisposedException을 catch하십시오.

예, AppDomain.CurrentDomain.UnhandledException에 대한 이벤트 처리기를 작성하고 Main() 메서드에 구독하십시오. e.ExceptionObject.ToString()의 값을 기록하거나 표시하여 정확히 무엇이 죽어 가고 있는지를 알 수 있습니다.

2

이 문제가 발생했습니다.

다른 응용 프로그램에서 키 스트로크 에뮬레이션을 수행하는 .Net 응용 프로그램을 작성했습니다. 나는 아침 내내 모든 일을 끝내기를 바라고 밤새도록 달려 가고 있었다. 방금 떠났어. 루틴에 입장 할 때마다 로그를 작성하여 정확히 무엇을했는지 확인할 수있었습니다. 아무것도, 예외 로깅하지 않습니다. 작업 작업 작업 만하면됩니다. And then, Nothing.

많은 API 호출을 사용하고 있었기 때문에 매우 자주 호출했습니다. 아마도 응용 프로그램의 작업 영역에서 메모리 누출이 발생했습니다.

<dirtyhack> 나는 그것이 충돌 한 (응용 프로그램 1) 시동 다른 닷넷 응용 프로그램 (애플리케이션 2) 를 작성하여이었다 해결 방법입니다. 이렇게 긴 응용 프로그램 1이 종료 된 후에는 쉘 응용 프로그램 2가 종료됩니다. 응용 프로그램 2는 응용 프로그램 1을 다시 시작합니다. </dirtyhack>

등등 모든 작업이 완료 될 때까지 계속됩니다. 지저분하고 좌절감이 들지만 꽤 아름답게 일을 끝냈습니다 :) 나는 많은 것을 확신합니다. 많은 것을하는 더 좋은 방법입니다. 아마 내 COM API 호출을 마샬링하지 않았을 것입니다.

하지만 응용 프로그램을 종료하고 다시 시작하면 메모리 누수가 발생하여 새로 시작하게됩니다.

아마도 당신의 상황에서는 아무런 소용이 없지만 그건 내 이야기입니다. 아멘.

관련 문제