2014-06-05 1 views
2

TestFlight에서 응용 프로그램이 충돌 할 때 마지막 TFLog를 수행하면 SIGSEGV의 충돌 보고서가 나에게 전송되었습니다.SIGSEGV

정확한 문제를 정확히 찾아내는 방법을 찾았습니다. 그러나이 작업을 수행하려면이 오류가 발생한 순간 정확히 TFLog 코드를 수행해야합니다.이 코드는 범인 코드를 찾는 데 도움이되는 중요한 정보를 포함합니다 (TestFlight의 백 트레이스가 현재 내게 쓸모가 없기 때문에).

필자는 이것이 실제로 가능한 것이라고 상상합니다. 결국, TestFlight는 충돌 보고서를 보낼 수 있습니다. 그러나, 어디에서? TFLog은 어디에 둘 수 있습니까?

답변

1

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을 호출하는 것을 피하기를 원할 것입니다. 왜냐하면 프로그램이 둘 중 하나에서 충돌 할 수 있고 신호 처리기 내에서 두 번째 분할 신호가 발생하지 않기를 원하기 때문입니다.

+0

내 문제는 분명히 내가 처리기에서 많이 할 수 없다는 것입니다 - 심지어 로깅 : http://stackoverflow.com/questions/24051879/what-can-i-do-in-a-signal- handler – Voldemort

+0

@JustKidding : TestFlight가 stderr 로깅을 지원할 수있는 것처럼 보입니다. 그럴 경우 반드시 stderr에 쓰기를 시도해 볼 수 있습니다 (필 요한 경우'write (STDERR_FILENO, buf, len)'사용). – nneonneo