目标c-强制iOS应用崩溃的最快方法是什么?

我正在尝试测试崩溃分析。 我没有意识到让应用程序随意崩溃有多么困难。 中间编程似乎很简单。 有人对我如何迫使我的应用崩溃的建议吗? 我的意思不是说“内存错误”崩溃,而是手机不知道该如何处理。 我至少需要它在Xcode的组织器中作为崩溃进入设备日志。 有什么建议?

Katushai asked 2020-08-12T02:47:29Z
9个解决方案
76 votes
@throw NSInternalInconsistencyException;
Stavash answered 2020-08-12T02:47:33Z
18 votes

杀死应用程序的方法有很多! 这是两个一线客:

[self performSelector:@selector(die_die)];

@[][666];
fsaint answered 2020-08-12T02:47:57Z
12 votes

只需编写assert(NO)。这将检查作为参数给出的条件,如果条件为假,则会使应用程序崩溃。

编辑:

exit(0)也可以解决问题

Levi answered 2020-08-12T02:48:27Z
9 votes
int* p = 0;
*p = 0;

给出ud2

编辑:

在格雷格·帕克斯(Greg Parkers)评论允许编译器优化上述语句之后,我使我对上述语句以及格雷格·帕克(Dreg Parker)正确的原因进行了更彻底的思考:

实际上,在C和C ++中,取消引用NULL指针是“未定义的行为”(另请参见C99§6.5.3.2/ 4)。

这意味着,以上语句的效果取决于编译器。 这种“未定义的行为”还意味着,允许编译器进行一些优化,这可能会导致上述语句“被优化”,就像格雷格·帕克(Greg Parker)断言的那样。

好吧,现在让我好奇的是c实际上会做什么:

这是小的测试程序:

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是操作码,表示“未定义操作码”,并导致CPU异常:

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

(也许@GregParker可以评论为什么clang选择这种方法?)

尽管这很有趣,但它仅指“解引用NULL指针”。 如果我们有这个:

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

该程序将按预期方式崩溃-但需要硬件拒绝的“先决条件”写入此(无效)地址。

CouchDeveloper answered 2020-08-12T02:49:36Z
6 votes

我认为良好的旧数组索引超出范围可以保证“成功崩溃”,因此,这里是我最喜欢的列表:

斯威夫特4:

  1. @throw NSInternalInconsistencyException;
  2. @throw NSInternalInconsistencyException;

目标C:

  1. @throw NSInternalInconsistencyException;
  2. @throw NSInternalInconsistencyException;

尽管@throw NSInternalInconsistencyException;解决了您的问题,但这是一个例外(不是崩溃),因此可能会被捕获。

Andrea Mugnaini answered 2020-08-12T02:50:09Z
4 votes

我经常发现使应用程序启动,执行一下操作然后在10秒钟后崩溃会很有用。 在这种情况下(对于Objective-C),我使用:

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

这样做的第二个好处是,编译器不会引发任何关于找不到选择器的警告(如果使用Objective-C)。 :)

迅速:

self.perform("crashme:", with: nil, afterDelay: 10)
ChrisJF answered 2020-08-12T02:50:40Z
3 votes

一种更受控制的方法是自己实际引发异常:

NSException.h

检查NSException.h以了解更多异常。

ABeanSits answered 2020-08-12T02:51:05Z
2 votes

这些迅速为我工作:

assert(false, "sdf")

还有这个:

var hey:[Int] = []
hey[0] = 1
Esqarrouth answered 2020-08-12T02:51:29Z
-1 votes
*(long*)0 = 0xDEADBEEF;

给出一个EXC_BAD_ACCESS

Antoine Rosset answered 2020-08-12T02:51:49Z
translate from https://stackoverflow.com:/questions/21555813/whats-the-quickest-way-to-force-an-ios-app-to-crash