Сбой журнала без сбоев? - PullRequest
       7

Сбой журнала без сбоев?

1 голос
/ 14 сентября 2011

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

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

Спасибо за любую помощь:)

Ответы [ 5 ]

5 голосов
/ 14 сентября 2011

Я использовал его пару раз, когда мне приходилось печатать трассировку стека:

+ (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

3 голосов
/ 05 октября 2011

Вот что я использую для своих стековых трасс:

        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

2 голосов
/ 17 февраля 2012

Раньше я тоже использовал backtrace_symbols для обработки моих сбоев, но потом я обнаружил, что это может быть опасно, так как метод не является асинхронным.С тех пор я посмотрел на множество решений для отчетов о сбоях и выбрал Crittercism для своих приложений, и это было довольно мило!

1 голос
/ 14 сентября 2011

Предлагаю вам проверить TestFlight SDK , выпущенный несколько дней назад.Он имеет несколько потрясающих функций, таких как удаленная регистрация и даже отчеты о сбоях в реальном времени.

0 голосов
/ 26 декабря 2011

Для специальной версии вы можете просто вызвать функцию abort (), или бросить и исключение какого-либо рода.

Версия App Store не будет выпущена, если она вообще вылетает во время тестирования.

...