sigaction
을 사용하여 SIGSEGV
처리기를 설치할 수 있습니다. 처리기에서 필요한 항목을 기록한 다음 앱을 종료 할 수 있습니다 (예 : abort()
).
예 : sigsegv_handler
등 전역에 액세스 할 수 있지만, 쉽게 부서지는 스택 프레임의 로컬 변수를 액세스하지 못할 수도
void sigsegv_handler(int signo, siginfo_t *info, void *ucontext) {
/* Inspect info to see where the crash occurred */
}
/* in main() or another suitable entry point */
struct sigaction sa;
sa.sa_sigaction = sigsegv_handler;
sigfillset(&sa.sa_mask);
sa.sa_flags = SA_SIGINFO;
sigaction(SIGSEGV, &sa, NULL);
참고
. 로그해야 할 것이 무엇인지 명확히한다면, SIGSEGV 핸들러에서 그 정보를 추출하는 방법을 알아내는 것이 가능할 수도 있습니다.
일부 기능은 기술적으로 SIGSEGV 핸들러에서 호출하기에 안전하지 않습니다. 그러나 전체 응용 프로그램이 죽어 가고 있기 때문에 잠금 기능을 다시 시도하기 때문에 교착 상태가 발생하지 않는 이상 이러한 함수를 호출하면 문제가 심각하게 악화되지는 않습니다. 그러나 중요한 것은 신호 처리기에서 malloc
또는 free
을 호출하는 것을 피하기를 원할 것입니다. 왜냐하면 프로그램이 둘 중 하나에서 충돌 할 수 있고 신호 처리기 내에서 두 번째 분할 신호가 발생하지 않기를 원하기 때문입니다.
내 문제는 분명히 내가 처리기에서 많이 할 수 없다는 것입니다 - 심지어 로깅 : http://stackoverflow.com/questions/24051879/what-can-i-do-in-a-signal- handler – Voldemort
@JustKidding : TestFlight가 stderr 로깅을 지원할 수있는 것처럼 보입니다. 그럴 경우 반드시 stderr에 쓰기를 시도해 볼 수 있습니다 (필 요한 경우'write (STDERR_FILENO, buf, len)'사용). – nneonneo