Я хочу проверить отчеты о сбоях моего приложения в полевых условиях, преднамеренно заставляя его падать, когда пользователь выполняет определенное действие, которое реальный пользователь вряд ли случайно сделает.
Но какой хороший надежный способ вызвать сбой приложения, который не создает предупреждение во время компиляции?
Изменить: Обратите внимание, что многие, казалось бы, очевидные ответы на этот вопрос приводят к исключениям, которые попадают в Какао и, следовательно, не приводит к падению приложения.
iphone
objective-c
ios
Нестор
источник
источник
WebKit discarded an uncaught exception
Пока я получаю все эти идеи! Кто знал, что в эти дни было так сложно вывести приложение из строя?(void)0/0;
,(void)*(char*)0;
Ответы:
в Objective-C используйте C напрямую, чтобы вызвать плохой доступ
Примечание: хотя это работает на любой системе, которую я знаю - в будущей версии среды выполнения C ИЛИ компиляторе это может больше не привести к сбою. см. Является ли разыменование нулевого указателя неопределенным поведением в Objective-C? )
(в быстром вы должны были бы соединиться с objC, чтобы сделать это)
источник
WebKit discarded an uncaught exception
тоже помогает обойтись.Мой текущий любимый:
Классика:
И некоторые pr0n:
Все они генерируют сбои, захваченные моим инструментом отчетности о сбоях.
источник
assert()
это функция отладки, которая не имеет смысла оставлять такие ошибки в сборках релизов. Для этого есть юнит-тесты.assert
это не функция отладки. Неудачное утверждение - это ошибка, которую вы считаете невозможной. Лучше прервать даже сборку релиза, чем продолжать запускать программу с непредсказуемыми последствиями.Поскольку мы все используем Clang для iOS, это довольно надежно:
Преимущество в том, что он предназначен именно для этой цели, поэтому он не должен генерировать никаких предупреждений или ошибок компилятора.
источник
abort();
вызывает ненормальное завершение ... Это сбой.источник
Как насчет старого доброго переполнения стека :)
источник
Самый популярный - нераспознанный сбой селектора:
Убедитесь, что в этом классе не реализован метод -asdf
Или индекс за пределами исключения:
И конечно
kill( getpid(), SIGABRT );
источник
Я думаю, что в Свифте вы можете легко бросить роковую ошибку:
На самом деле она даже предназначена для использования этой функции на случай, если что-то пойдет не так, чтобы приложение зависало.
Чтобы избежать оператора if в особом случае, вы также можете использовать
precondition
. Это похоже наassert
, делает, таким образом, намерение (если требуется ) довольно ясным и не удаляется в финальной версии какassert
. Это используется какprecondition(myBoolean, "This is a helpful error message for debugging.")
.источник
Отправить сообщение освобожденному объекту
источник
(должен ... ввести ... 30 символов)
источник
Вы также можете вызвать исключение:
источник
Добавьте распознаватель жестов в представление, которое распознает касание 10 пальцами (5 пальцев для iPhone при 10 могут быть немного переполнены). К GR прикреплен метод, который выполняет любой из ранее упомянутых безошибочных способов заставить ваше приложение аварийно завершиться. Большинство пользователей не собираются прилагать 10 усилий к вашему приложению, поэтому вы в безопасности от обычного пользователя, случайно вызвавшего сбой.
Однако вы должны иметь возможность использовать что-то вроде Testflight или просто развернуть его на персональных устройствах и протестировать на свободе, прежде чем отправлять его в Apple. В случае принудительного сбоя Apple может отклонить ваше приложение.
источник
может попробовать что-то вроде
должен произойти сбой на EXC_BAD_ACCESS (возможно, потребуется выпустить его во второй раз, но обычно это уже должно произойти сбой, как это)
источник
Я пойду с:
int raise(int sig);
Чтобы получить больше информации
>man raise
источник
Я бы просто убил процесс нормально:
Поэтому, если вы устанавливаете обработчик с сигналом, вы также можете обрабатывать сбой, заканчивая записывать открытые файлы и тому подобное.
источник
я использую
источник
При работе с RubyMotion я использую это:
источник
Попробуй это:
источник
неправильное
NSLog
утверждение сделает этоисточник