Является ли такой отчет о сбое бесполезным? - PullRequest
0 голосов
/ 13 ноября 2009

Я пытался использовать «PLCrashReport», чтобы собрать информацию о сбое, а затем сделать приложение более стабильным, но оказалось, что отчет похож на этот (даже нет стека вызовов, как мне его использовать?):

Часть «Exception:», Exception: (null): (null), которые должны быть «exceptionName» и «exceptionReason», в большинстве случаев являются «нулевыми», не знаю почему, иногда будет нормальное значение но я думаю, что не совсем полезно ...

Сбой 2009-11-13 23:43:04 +0800 - Сигнал SIGSEGV (код SEGV_ACCERR, адрес = 0xffffffffc0f4186b)

  • Исключение: (ноль): (ноль) - поток 0:

    • Сбой: 1
    • Стек (54 кадра):, \ n 806128664, \ n 807756495, \ n 816280840, \ n 816247 068, \ n 817901396, \ n 807756495, \ n 816280840, \ n 817911108, \ n 816247068, \ n 816285160, \ n 816406620, \ n 807756495, \ n 806130012, \ n 119241, \ n 812165747, \ n 812 \ n 812379009, \ n 818127880, \ n 807885435, \ n 807923065, \ n 818122176, \ n 818130772, \ n 816625560, \ n 816626608, \ n 816627024, \ n 816641892, \ n 816651496, \ n 816 816654224, \ n 146455, \ n 807923363, \ n 816119156, \ n 816119004, \ n 818227300, \ n 807923363, \ n 816119156, \ n 816119004, \ n 816524332, \ n 816525915, \ n 81652 \ n 816151252, \ n 816147980, \ n 827758796, \ n 827769116, \ n 837343488, \ n 821391952, \ n 807840887, \ n 807836793, \ n 807834407, \ n 827752032, \ n 816118388, \ n816717

Ответы [ 2 ]

3 голосов
/ 03 декабря 2009

Что такое трассировка стека?

Каждый раз, когда вызывается один из ваших методов, он помещает это в стек. Трассировка стека - это способ выяснить, в каком классе и методе произошло сбой вашего приложения, что часто сводит ошибку к одной строке.

Конечно, для этого трассировка стека должна быть читаемой, а не целая загрузка шестнадцатеричных чисел.

Выезд на ато.

Чтобы это не повторилось, вы можете интерпретировать этот стек вызовов с помощью atos. См. Страницу Stack Traces вики Cocoa Dev для обсуждения и кода о том, как преобразовать эти числа в значимые методы.

Вам нужно будет найти способ интегрировать это с репортером сбоев. Я использую UKCrashReporter, и я изменил код Ули, так что если есть необработанное исключение, он добавляет читаемую трассировку стека в отчет о сбое.

Пример кода

Я черпал вдохновение из класса ESStackTrace и вот что я делаю:

-(void)logAndSaveStackTrace {
    NSString *stackTrace = [[self userInfo] objectForKey:NSStackTraceKey];
    NSString *atosCommand;
    if (stackTrace) {
        // If the stack trace key is present, pull out the addresses and convert to method names using atos.
        atosCommand = [NSString stringWithFormat:@"/usr/bin/atos -p %d %@ | tail -n +3 | head -n +%d | c++filt | cat -n",
                         [[NSProcessInfo processInfo] processIdentifier],
                         stackTrace,
                         ([[stackTrace componentsSeparatedByString:@"  "] count] - 4)];

    } else {
        // If there isn't a stack trace key or it's nil, try and work out the stack using the internal callStackReturn addresses method.
        NSArray *stackTraceArray = [self callStackReturnAddresses];
        atosCommand = [NSString stringWithFormat:@"/usr/bin/atos -p %d %@",
                       [[NSProcessInfo processInfo] processIdentifier],
                       [stackTraceArray componentsJoinedByString:@" "]];
    }

    NSString *readableStackTrace = [ShellTask executeShellCommandSynchronously:atosCommand];

    NSString *exceptionMessageForCrashReport = [NSString stringWithFormat:@"An exception of type %s occured.\n%s\nStack trace:\n%@", 
                                                [[self name] cStringUsingEncoding:NSUTF8StringEncoding], 
                                                [[self reason] cStringUsingEncoding:NSUTF8StringEncoding],
                                                readableStackTrace];

    [[NSUserDefaults standardUserDefaults] setObject:exceptionMessageForCrashReport forKey:@"uncaughtExceptionReport"];
    [[NSUserDefaults standardUserDefaults] synchronize];

    // Log the exception to the console too.
    NSLog(@"%@", exceptionMessageForCrashReport);
}

Зависимости Ахой!

Конечно, одна из проблем этого подхода заключается в том, что вы вводите зависимость от atos. Мне сказали, что он установлен как стандарт на 10.5 и позже, но это может быть неправильно. В конце концов я собираюсь сделать небольшой установщик, который добавляет atos, если мое приложение не может его найти.

1 голос
/ 13 ноября 2009

Я не использовал его, но я уверен, что вы не получите никакой детализации, потому что у вас была ошибка сегментации, которая вывела все вплоть до регистров. Экземпляр PLCrashReport не может сообщить, потому что он умер вместе со всем остальным.

Экземпляры PLCrashReport выполняются внутри самого приложения, поэтому, если приложение сильно выходит из строя, вы не получите никаких подробностей.

...