2014-02-04 1 views
30

Я пытаюсь проверить свою аналитику крушения. Я не понимал, как сложно сделать атаку приложения по своему усмотрению. это кажется таким простым средним программированием. Кто-нибудь имеет предложение о том, как я могу заставить приложение сбой? И я не имею в виду небольшую ошибку «ошибка памяти», я имею в виду, что телефон не знает, что делать с собой. Мне нужно, чтобы он, по крайней мере, вошел в журналы устройств в качестве сбоя, в организаторе Xcode. Какие-либо предложения?Какой самый быстрый способ заставить приложение iOS сбой?

+2

Просто доступ к элементу вне области массивов ... –

+29

Просто продолжайте кодирование, это произойдет в конце концов :) –

+0

Я попытался получить доступ к элементу вне области массива, но это не сработало. просто рассматривал его как null. и когда я попытался разделить это значение, он просто рассматривал его как 0. поскольку он является архитектурой ARM, он фактически делит на ноль и продолжает идти – Katushai

ответ

58
@throw NSInternalInconsistencyException; 
+0

, этот работал. Я принял этот ответ, потому что он пришел первым, но утверждать (нет) также работал.также я выбрал этот, потому что он, по-видимому, является родным для какао, в отличие от C, поэтому яблоко разработало это по этой конкретной причине (моя догадка) – Katushai

+3

Бросание исключения не обязательно приводит к сбою. Если исключение будет поймано, программа может продолжить. Если исключение не будет обработано, будет вызываться системная функция 'terminate()', которая в свою очередь вызывает 'abort()'. То есть, строго, программа НЕ сбой, но она _terminates_. – CouchDeveloper

+0

завершение привело к сообщению о сбоях моей аналитике, так что это сработало для моих целей. – Katushai

10

Просто напишите assert(NO). Это проверяет условие, заданное как параметр, и приводит к сбою приложения, если оно ложно.

Edit:

exit(0) также сделать трюк

+0

Это также работает при компиляции для выпуска версии? – Stavash

+0

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

+0

@Stavash По умолчанию нет. Но это легко сделать. Проверьте настройки своей цели: Apple LLVM 5.0 - Предварительная обработка> Включить утверждения утверждений. – Desdenova

2

более контролируемым способом был бы на самом деле бросить исключение себя:

@throw [NSException exceptionWithName:NSGenericException reason:@"" userInfo:nil];

Проверьте NSException.h больше исключений.

13

Так много способов убить приложение! Вот два один лайнеры:

[self performSelector:@selector(die_die)]; 

также

@[][666]; 
+0

Вызов 'exit' не вызывает сбой. – rmaddy

+3

@maddy ... вы правы, сэр! спасибо за то, что мой счет был кратным 10. Эти дополнительные 2 очка заставляли меня гать. – fsaint

+1

Я не спускал вниз. Кто-то другой. Не делайте таких предположений. – rmaddy

7
int* p = 0; 
*p = 0; 

дает EXC_BAD_ACCESS (code=2, address=0x0)

Edit:

После Greg Parkers комментарий о том, что компилятор позволил оптимизировать прочь вышеупомянутые заявления, это сделало меня думаю, что более подробно об этих заявлениях, и почему Грег Паркер прав:

В самом деле, разыменования указателя NULL является «неопределенное поведение» в C и C++ (см также C99 §6.5.3.2/4).

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

Ну, теперь, когда меня интересно, что лязг бы на самом деле:

Это небольшая тестовая программа:

int main(int argc, const char * argv[]) 
{ 
    int* p = 0; 
    *p = 0; 
    return 0; 
} 

с оптимизацией, установленным в «-Ofast», мы получаем эту разборку:

0x100000f90: pushq %rbp 
0x100000f91: movq %rsp, %rbp 
0x100000f94: ud2  

где ud2 это код операция означает «неопределенный» опкод и вызывает исключение процессора:

`EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)` 

(Возможно, @GregParker может комментировать, почему clang выбирает этот подход?)

Хотя это интересно, оно относится только к «разыменованию указателя NULL». Если мы вместо этого:

int* p = (int*)1; 
*p = 0; 

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

+0

Компилятор может оптимизировать это. –

+0

@GregParker Правда, но это другая «проблема»;) – CouchDeveloper

+0

+1 для описательного исправленного ответа – Katushai

-1
*(long*)0 = 0xDEADBEEF; 

Дает EXC_BAD_ACCESS

+1

Компилятор может оптимизировать это. –

1

Для быстры они работали для меня:

assert(false, "sdf") 

И это:

var hey:[Int] = [] 
hey[0] = 1 
+0

Пожалуйста, объясните, почему ваш ответ является решением вопроса. – Qix

+1

Я не знаю почему и не очень забочусь. он сбой и делает это с минимальным кодом – Esqarrouth

+1

Вы ответчик, вам все равно. – Qix

4

Я часто бывает полезно иметь приложение запускается, сделайте свое дело немного, а затем сработайте через 10 секунд. В этом случае (для Objective-C), я использую:

[self performSelector:NSSelectorFromString(@"crashme:") withObject:nil afterDelay:10]; 

Второе преимущество этого является то, что компилятор не выдает никаких предупреждений (при использовании Objective-C) о селекторе не найден , :)

Swift:

self.perform("crashme:", with: nil, afterDelay: 10) 
0

Я думаю, что хороший старый индекс массива вне диапазона является гарантией успешного "аварии", так вот мой любимый список:

Swift 4 :

  1. [][0]
  2. fatalError()

Objective-C:

  1. @[][0];
  2. int *x = nil; *x = 0;

Хотя @throw NSInternalInconsistencyException; исправляет проблему, является исключением (не авария), следовательно, может быть caught.

Смежные вопросы