2012-08-24 1 views
1

나는 가드 통지를하기 위해 프로그램이 실패 할 때보 다이 핸들러에서 잡히게되기를 원한다.C++에서 단일 catch-all-failures 후크가 있습니까?

내 처리기를 통과하지 않고 프로그램을 중단 할 수 없도록하려면 등록해야하는 하위 처리기 또는 처리기 목록이 있습니까? 단지 우분투 I 예외 메모리 할당과 같은 장애의 모든 종류를 필요 에 필요한 우분투 용액에서 실행

...

+0

은 (이유가 무엇이든) 죽을 때 프로그램을 다시 시작하는 쉘 스크립트가 허용 가능한 접근 방법입니까? – PypeBros

답변

2

간단히 대답하면 아니요 단일 지점으로 프로그램의 모든 오류를 처리 할 수 ​​있습니다. maintry/catch (...)을 추가하면 main이 입력되고 완료되기 전에 발생하는 예외를 처리 할 수 ​​있습니다. C++에서 terminate에 대한 핸들러를 추가 할 수도 있습니다.OS에 따라 다른 상황을 다르게 처리해야합니다 (잘못된 메모리 참조는 SIG_SEGV를 처리하여 unix/linux에서 처리 할 수 ​​있지만 Windows -AFAIK에서는 작동하지 않으며 일부 다른 오류는 처리되지 않습니다 ...) 그 이상으로, 여전히 주목받지 못하는 오류가있을 수 있습니다 (유효하지 않은 메모리 액세스가 유효한 메모리 주소에 도달하면 ... 프로그램이 올바르지 않지만 오류가 감지되지 않을 수 있음)

0

호 처리가 SIGKILLkill ED 인 경우, 예를 들면, 어떤 핸들러가 없을 것 운영.

P. 참고로, 이것은 SPOF과 아무 관련이 없습니다.

+0

@cHao : 'SIGKILL'이 언급되지 않은 이전 버전이 있다고 생각합니다. 더 이상 적용되지 않는 주석 제거. –

2

가상 샌드 박스에서 C++이 실행되지 않으므로 언어를 인식 할 수있는 기본 제공 언어가 없습니다. 물론 예외 (예를 들어 예외를 사용하여)를 직접 만들 수도 있지만, 기초부터 구성하는 것은 코드에 달려 있습니다.

실행중인 플랫폼에 사용할 수있는 무언가가있을 수 있습니다. 예를 들어 Windows의 경우 SetUnhandledExceptionFilter입니다.

물론이 모든 것은 여전히 ​​"충돌"의 의미에 달려 있습니다.

1

Linux의 경우 SIGABRT 신호에 응답해야합니다. 귀하의 callback는 당신의 앱이 SIGSEGV, 당신은 후크 네드 SIGBUS 등 다양한 시나리오에 대해 서로 다른 신호가 있습니다

signal(SIGABRT, &callback); 

SIGABRT 신호를 얻을 때마다 호출됩니다. 당신은 다른 콜백에서 그들을 연결하고 어떤 에러가 무엇으로 들어가는지 확인하는 것이 좋습니다. 여러 가지 문제로 인해 한 가지 오류가 발생할 수 있기 때문입니다.

+0

segfaults에 대해'SIGSEGV'를 잊지 마십시오. –

+0

그리고'SIGILL'과'SIGBUS' - 그 외에는 완전히 맞습니다. – Damon

+0

메모리 오류가 발생합니까? –

0

상위 수준에 try/catch(...) 블록을 넣으면 모든 예외를 catch 할 수 있습니다. 그러나 프로그램을 종료 할 수있는 다른 방법이 있으며이를 포착하는 방법은 이식 가능하지 않습니다. 유닉스 기반의 시스템에서는 신호 처리기를 만들어야하지만 그것도 멈추지 않을 것이다. kill -9.

+0

try-catch는 예외가 아닌 예외 만 처리합니다. –

+0

'try' /'catch'의 경우, 생성 된 각 스레드 주위에 넣어야합니다. –

2

프로세스가 시작될 때 fork으로 전화하십시오. 자녀를 모니터링하려면 부모를 사용하십시오. 치명적인 오류가 발생하면 프로세스가 사라집니다. 당신은 이것을 발견 할 수 있고 그것이 일어 났을 때 당신이해야 할 일을 다 할 수 있습니다. 아이가 정상적으로 종료하고 싶다면, 종료하기 전에 부모를 죽일 수 있습니다.

+0

+1, 부모 프로세스를 종료하는 대신 프로세스 종료 값을 사용하여 정상/비정상 종료를 결정합니다. – mitchnull

2

일반 프로그램 종료의 경우 std::atexit()과 함께 처리기를 등록 할 수 있습니다.

uncaught exceptions/... 때문에 프로그램이 종료되면 std::set_terminate으로 처리기를 등록 할 수 있습니다. "예외 메모리 할당"으로 인해 std::bad_alloc 예외가 발생하면이 처리기가 트리거되어야합니다.

관련 문제