Журнал сбоев без сбоев?

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

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

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


person IainNotAndrew    schedule 14.09.2011    source источник
comment
Журнал сбоев или трассировка стека?   -  person Krishnabhadra    schedule 14.09.2011


Ответы (5)


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

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

person 0x8badf00d    schedule 14.09.2011
comment
Я думаю, это потому, что вы просто перешли на внешнюю ссылку. Я видел, как такие ответы отвергаются повсюду в SO, даже если у них есть такие полезные ссылки, как ваша. Возможно, вы захотите отредактировать свой ответ, чтобы вкратце описать содержание ссылки. Вот вам голос за то, чтобы исправить это уродливое -1. - person Filip Radelic; 15.09.2011
comment
почему вы используете 128? - person Meniny; 28.07.2017

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

        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

person leonardo69    schedule 05.10.2011

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

person idogg98    schedule 17.02.2012

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

person Filip Radelic    schedule 14.09.2011

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

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

person Walt Sellers    schedule 26.12.2011