크래시 복구
답변
여기에 몇 가지 옵션이 있습니다.
첫 번째 (최고의) 하나가 어떤 다른 캐치되지 않는 예외를 포착하고 적절하게 처리 할 글로벌 오류 처리의 몇 가지 유형을 추가하는 것입니다. 이 행을 따라 코드 기반에 적절한 특정 예외 처리를 추가해야합니다. 스택 오버플로와 특정 보안 및 메모리 예외가 전역 처리를 불문하고 불어날 것이라는 점에 유의하십시오.두 번째 옵션은 현재 응용 프로그램이 여전히 작동하는지 확인하기 위해 테스트하는 모니터링 서비스를하는 것입니다. 그렇지 않으면 기존 응용 프로그램을 강제 종료하고 새 인스턴스를 다시 시작합니다.
세 번째 옵션은 애플리케이션을 두 개의 앱으로 분리하는 것입니다. 다른 프로세스를 단순히 실행하는 외부 '컨테이너'유형의 앱입니다. 컨테이너 앱에는 UI가 없지만 주 프로세스를 시작하고이를 볼 것입니다 (위의 옵션 2와 매우 유사 함). 나는이 모듈이 다양한 "모듈 형"응용 프로그램에서 사용되는 것을 보았습니다. 하나는, 다른 하나는 실제로 UI와 다른 모든 일을 모니터링하기 :
는 요점은,이 작업을 수행 할 수있는 유일한 방법은이 응용 프로그램을하는 것입니다.
글로벌 오류 '핸들러', 많은 오류를 처리 할 수 없습니다 .. 그 정의에 폭포를 건설 즉, 응용 프로그램 상태가 여전히 유효한지 여부.) 진정한 충돌 (적절한 계층에서 처리 할 수 없거나 처리 할 수 없었던 예외)을 처리하기 위해 주 프로세스로 시작하고 중지하는 호스팅 프로세스 솔루션에 투표합니다. .NET에서는 완전히 별도의 프로세스가 필요하지 않고 호스트 된 응용 프로그램에 대해 별도의 AppDomain을 사용하여 완전히 완료 할 수 있습니다. –
트랜잭션을 지원하는 항목에 영구 상태를 둡니다. 예 : 데이터베이스 (sqlite) 또는 필요가 너무 복잡하지 않은 경우 copy on write를 사용하십시오 (새 파일에 변경 사항을 쓰고 성공한 경우에만 이전 파일을 버려야합니다)
이러한 제안은 매우 일반적입니다.
그것은 더 나은이 작업을 수행하지 일반적이며, 지속적으로 시작하고 즉시 사용자가 속수무책 대학살을보고 다시 충돌 과정에 대해 꽤 아무것도 없다. 하지만 총알 만 건네 줄 수 있습니다. 발에 총을 겨누는 것은 당신에게 달린 것입니다. 다음과 같은 코드가 필요합니다.
static void Main(string[] args) {
AppDomain.CurrentDomain.UnhandledException += ReportAndRestart;
// etc..
}
static void ReportAndRestart(object sender, UnhandledExceptionEventArgs e) {
string info = e.ExceptionObject.ToString();
// Log or display info
//...
// Let the user know you're restarting
//...
// And restart:
System.Diagnostics.Process.Start(
System.Reflection.Assembly.GetEntryAssembly().Location,
string.Join(" ", Environment.GetCommandLineArgs()));
Environment.Exit(1);
}
}
명령 줄 인수에 대한 바로 가기를 사용했는지주의하십시오. 공백이 포함 된 파일의 경로가 포함되어있는 경우 따옴표로 묶어야합니다. 줄임표에 넣어야하는 코드에 바로 가기를 사용하지 마십시오.
Windows 서비스에서 지속적으로 다시 시작하는 충돌 프로세스의 한 가지 해결 방법은 프로세스를 다시 시작하려고 시도하는 횟수 제한입니다. 이는 시작된 응용 프로그램을 모니터링하고 충돌에 대한 상태를 유지할 수있는 외부 '호스팅'프로세스가있을 때 가장 효과적입니다. 이것은 UI 기반 응용 프로그램보다 서비스에서 더 잘 작동하지만 적어도 서비스에서는 충돌 및 재시작이 대부분 사용자에게 투명합니다. –
신청 상태를 회복하는 것은 어떻습니까? 각 단위는 응용 프로그램을 계속 사용하는 데 중요한 상태를 가질 수 있습니다. – Arijoon
- 1. 크래시 된 서버에서 MySQL 테이블 복구
- 2. MySQL의 복제 및 마스터 서버 크래시 복구
- 3. 실행 루프 종료 - 자동 복구 풀 복구
- 4. 테이블 복구
- 5. setjmp/신호 크래시 예외 처리
- 6. IE8에서 탭 복구 로그가 손상 되었습니까?
- 7. 크래시 덤프의 모듈 버전
- 8. 임의의 크래시 디버깅
- 9. Java 크래시 파일 해석
- 10. llvm-ld 크래시 디버깅
- 11. Python 크래시 디버그
- 12. 비주얼 스튜디오 크래시
- 13. 테이블 뷰 셀에서의 크래시
- 14. 레코드 편집시 크래시
- 15. 크래시 덤프 완료 알림
- 16. SHBrowseForFolder() 내에서 크래시 받기
- 17. 서비스 dll을로드하는 크래시
- 18. 종료 전 cvs2svn 크래시
- 19. 빈 EditText Android 크래시
- 20. Android 자르기 이미지 크래시
- 21. 크래시 로그 분석
- 22. 안드로이드 네이티브 코드 크래시
- 23. 코드 크래시 안드로이드
- 24. 재개시 CALayerInvalid 크래시
- 25. C# 크래시 덤프가 없습니다.
- 26. ReadDirectoryChangesW 사용시 크래시
- 27. 어셈블리에서 사용자 크래시 디버그
- 28. 크래시 덤프를 얻는 방법
- 29. UIScrollview의 백그라운드 스레드에서 크래시
- 30. boost :: thread로 크래시
신청서에 어떤 주를 가지고 있습니까? –
죄송합니다. "주"? – MBZ
상태, 현재보기, 저장되지 않은 변경 사항, 탐색 기록, 응용 프로그램의 "위치"와 사용자가 작성한 내용에 대한 모든 것. –