Каков надежный способ сделать сбой приложения iOS?
Я хочу проверить отчет о сбоях моего приложения в поле, намеренно заставляя его сбой, когда пользователь выполняет определенное действие, которое реальный пользователь вряд ли сделает случайно.
но каков хороший надежный способ сделать сбой приложения, который не создает предупреждение во время компиляции?
Edit: обратите внимание, что многие, казалось бы, очевидные ответы на этот вопрос приводят к исключениям, которые попадают в какао и, таким образом, не приводят к приложению обрушивающийся.
18 ответов:
в Objective-C используйте C напрямую, чтобы вызвать плохой доступ
strcpy(0, "bla");Примечание: хотя это работает на любой системе, которую я знаю-в будущей версии среды выполнения C или компилятора это может больше не привести к сбою. смотрите является ли разыменование нулевого указателя неопределенным поведением в Objective-C?)
(в swift вы должны были бы перейти к objC, чтобы сделать это)
мои любимые:
assert(! "crashing on purpose to test <insert your reason here>");классика:
kill( getpid(), SIGABRT );и некоторые pr0n:
*(long*)0 = 0xB16B00B5;все они генерируют сбои, захваченные моим инструментом отчетов о сбоях.
Так как мы все используем Clang для iOS, это довольно надежно:
__builtin_trap();это имеет то преимущество, что он предназначен именно для этой цели, поэтому он не должен генерировать никаких предупреждений компилятора или ошибок.
самый популярный один-непризнанный селектор аварии:
NSObject *object = [[NSObject alloc] init]; [object performSelector:@selector(asfd)];убедитесь, что у вас нет метода-asdf, реализованного в этом классе haha
или индекс за пределами связанного исключения:
NSArray * array = [NSArray array]; [array objectAtIndex:5];и конечно
kill( getpid(), SIGABRT );
Я думаю, что в Swift вы можете легко бросить фатальную ошибку:
func foo() { fatalError("crash!") }на самом деле он даже предназначен для использования этой функции в случае, если что-то пойдет не так, чтобы сделать приложение аварии.
чтобы избежать оператора if в специальном случае, вы можете использовать
preconditionтоже. Это похоже наassert, делает таким образом намерение (если хотите) довольно ясно и не удалено в финальной версии какassert. Он используется какprecondition(myBoolean, "This is a helpful error message for debugging.").
вы также можете создать исключение:
[NSException raise:NSInternalInconsistencyException format:@"I want to test app crashes!."];
добавьте распознаватель жестов в представление, которое распознает 10-пальцевый кран (5 пальцев для iPhone, поскольку 10 могут быть немного переполнены). GR имеет прикрепленный к нему метод, который выполняет любой из ранее упомянутых надежных способов заставить ваше приложение аварийно завершить работу. Большинство пользователей не собираются класть 10 пальцев на ваше приложение, поэтому вы в безопасности от обычного пользователя, случайно вызвавшего сбой.
однако вы должны иметь возможность использовать что-то вроде Testflight или просто развернуть его в personal устройства и тест в дикой природе, прежде чем когда-либо представить его в Apple. Наличие принудительного сбоя может привести к тому, что ваше приложение будет отклонено Apple.
может попробовать что-то вроде
NSArray* crashingArray = [NSArray arrayWithCapacity:1]; [crashingArray release];должен рухнуть на EXC_BAD_ACCESS (возможно, потребуется выпустить его во второй раз, но обычно он должен рухнуть, как это уже)
Я бы просто убил процесс нормально:
kill(getpid(), SIGKILL);поэтому, если вы установите обработчик с сигналом, вы также можете обработать сбой, закончив писать открытые файлы и все такое.
попробуйте это:
- (IBAction)Button:(id)sender { NSArray *array = [NSArray new]; NSLog(@"%@",[array objectAtIndex:8]); }
Comments