카테고리 없음

[아이폰] 크래시없이 크래시 로그?

행복을전해요 2020. 12. 19. 19:48

스택 추적을 인쇄해야 할 때 몇 번 사용했습니다.

+ (NSArray *)backtrace
{
    void* callstack[128];
        int frames = backtrace(callstack, 128);
            char **strs = backtrace_symbols(callstack, frames);
            
                int i;
                    NSMutableArray *backtrace = [NSMutableArray arrayWithCapacity:frames];
                        for (
                                i = UncaughtExceptionHandlerSkipAddressCount;
                                        i < UncaughtExceptionHandlerSkipAddressCount +
                                                    UncaughtExceptionHandlerReportAddressCount;
                                                            i++)
                                                                {
                                                                        [backtrace addObject:[NSString stringWithUTF8String:strs[i]]];
                                                                            }
                                                                                free(strs);
                                                                                
                                                                                    return backtrace;
                                                                                    } 
                                                                                    

"iPhone에서 응용 프로그램이 충돌하면 사용자에게 무슨 일이 있었는지 알리지 않고 사라집니다. 그러나 응용 프로그램에 예외 및 신호 처리를 추가하여 사용자에게 오류 메시지를 표시하거나 변경 사항을 저장할 수 있습니다. 충돌없이이 상황에서 복구를 시도 할 수도 있습니다. " http://cocoawithlove.com/2010/05/handling-unhandled-exceptions-and.html을 보십시오

-------------------

내 스택 트레이스에 사용하는 것은 다음과 같습니다.

        NSArray *callStackArray = [exception callStackReturnAddresses];
        int frameCount = [callStackArray count];
                void *backtraceFrames[frameCount];
                
                        for (int i=0; i < frameCount; i++) {
                                    backtraceFrames[i] = (void *)[[callStackArray objectAtIndex:i] unsignedIntegerValue];
                                            }
                                            
                                                    char **strs = backtrace_symbols(backtraceFrames, frameCount);
                                                    
                                                            NSMutableArray *backtraceArray = [NSMutableArray arrayWithCapacity:frameCount];
                                                                    for (int i = 0; i < frameCount; i++) {
                                                                                NSString *entry = [NSString stringWithUTF8String:strs[i]];
                                                                                            [backtraceArray addObject:entry];
                                                                                                    }
                                                                                                            free(strs);
                                                                                                            

앱에 해를 끼치 지 않는지 확인하기 만하면됩니다. http://landonf.bikemonkey.org/2011/09/14 . PLCrashReporter사용 하여 모든 충돌을 처리하거나 나처럼 게으르다면 Crittercism 과 같은 서비스를 사용할 수도 있습니다.

-------------------

내 충돌을 처리하기 위해 backtrace_symbols를 사용했지만 메서드가 비동기 안전하지 않기 때문에 위험 할 수 있음을 알게되었습니다. 그 이후로 많은 크래시보고 솔루션을 살펴보고 내 앱을 위해 크 리터 시즘사용 했는데 정말 멋졌습니다 !

-------------------

며칠 전에 출시 된 TestFlight SDK 를 확인하시기 바랍니다 . 원격 로깅 및 라이브 충돌 보고서와 같은 멋진 기능이 있습니다.

-------------------

임시 버전의 경우 abort () 함수를 호출하거나 일종의 예외를 발생시킬 수 있습니다.

테스트 중에 충돌이 발생하면 App Store 버전을 배송 할 수 없습니다.



출처
https://stackoverflow.com/questions/7417004