2014-04-04 3 views
0

나는 충돌없이 실행해야하는 데몬 유틸리티가 있습니다. 신호를 등록하고 SIGKILL을 제외한 모든 신호를 건너 뛸 수 있다는 것을 알고 있습니다.C++의 크래시 처리기

내 데몬이 멀티 스레드이고 스레드에있는 일부 코드로 인해 SIGABRT 신호가 발생했는지 알고 싶습니다. 스레드 종료가됩니까? 또는 SIGABRT 신호를 건너 뛰면 해당 스레드가 계속 실행됩니다 ..?

의 그것을 종료하지 않는 경우

*** error for object 0x101800068: incorrect checksum for freed object - object was probably modified after being freed. 

내가, 내 스레드 프로그램을 계속 실행 가능하고 어떤 문제를 만들 것입니다 내 응용 프로그램이 마지막으로이 오류로 인해 추락 가정 해 봅시다 ..?

아무리해도 내 응용 프로그램을 계속 실행하고 싶습니다. 프로세스 재시작과 같은 오류로부터 응용 프로그램을 복구하고 싶습니다. 내가 충돌 신호 동안 내 main()을 제외한 모든 스레드를 종료하고 모든 스레드를 다시 시작할 수 있다면 더 좋을 것입니다. 하지만 내가 아는 한, 스레드가 신호 중에 종료되지 않습니다. 이 신호들 중에 모든 스레드를 종료 할 수 있도록 어떻게 다시 시작할 수 있습니까?

+2

이러한 신호를 유발하는 몇 가지 문제점은 실제로 좋지 않으며 복구 할 수 없다는 것을 알고 계십니까? –

+0

@JoachimPileborg 우리는 C++ 예외 처리가 너무 느리기 때문에 이러한 신호가 실제로 복구 할 수없는 문제를 야기하지는 않을뿐만 아니라 예외적으로 (예외는 아니지만) 전형적인 것이기 때문에 복구 불가능 (문서 확인) – IdeaHat

+1

@ JoachimPileborg에 완전히 동의합니다. 추가 [가정에 포인트를 운전] (http://akrzemi1.wordpress.com/2011/10/05/using-stdterminate/ "http://akrzemi1.wordpress.com/2011/10/05/using-stdterminate/ ") :"* ... [T] 여기에는 세계에서 "무엇을 하든지 상관없이"실행하는 것이 주 목적 인 프로그램이 없습니다. 프로그램은 유용한 것을해야하며, 예외적 인 경우에 의해 예방되는 경우, 프로그램 유용하지 않은 (또는 유해한 일을하는) 일을하지 않는 것은 누구에게나 필요하지 않습니다. * " – Lilshieste

답변

0

[코멘트 너무 긴]

이 스레드가 내려 가서 강제로 조건은 하나 개의 스레드가 전체 프로그램 다운되면 내려갑니다. 그게 전부 야.

이는 프로세스마다 다릅니다.

더 강력한 멀티 태스킹 시스템을 구축하는 한 가지 방법은 스레드 대신 프로세스를 사용하여 다른 프로세스가 충돌시 각 프로세스를 감독하고 다시 시작하는 것입니다. 후자는 또한 감독 될 수 있고 충돌시 재시동 될 수 있습니다. 그러면 다음과 같이 될 수 있습니다.

그래, 충돌하지 않는 코드를 생성/작성하는 것이 더 효율적일 수 있습니다.