迫使iOS应用程序崩溃的最快方法是什么?

Kat*_*hai 41 objective-c crash-reports flurry ios

我正在尝试测试我的崩溃分析.我没有意识到让应用程序崩溃是多么困难.中编程似乎很简单.有没有人建议我如何强迫我的应用程序崩溃?我并不是说有一点"内存错误"崩溃,我的意思是手机不知道该如何处理自己.在Xcode的组织者中,我至少需要它作为崩溃进入设备日志.有什么建议?

Sta*_*ash 76

@throw NSInternalInconsistencyException;
Run Code Online (Sandbox Code Playgroud)

  • 抛出异常并不一定会导致崩溃.如果将捕获异常,则程序可以继续.如果不处理异常,将调用系统函数`terminate()`,然后调用`abort()`.也就是说,严格来说,程序不会崩溃,但它会_terminates_. (4认同)
  • 为什么不直接调用abort()呢?可以捕获抛出的异常 - abort()不能.在Mac上,abort()会生成一个崩溃日志,我认为它也适用于iOS. (2认同)

fsa*_*int 18

杀死应用程序的方法很多!这是两个一个衬垫:

[self performSelector:@selector(die_die)];
Run Code Online (Sandbox Code Playgroud)

@[][666];
Run Code Online (Sandbox Code Playgroud)

  • @ []是一个空数组.666是难以形容的数字.任何数字都会导致崩溃,我选择666作为戏剧性价值. (9认同)
  • @maddy ......你是对的先生!感谢你让我的分数为10的倍数.额外的2分让我疯狂. (3认同)
  • 我没有投票。有人做过。不要做这样的假设。 (2认同)
  • @maddy对不起,我指责。干杯! (2认同)

Lev*_*evi 12

只要写assert(NO).这将检查作为参数给出的条件,如果错误,则会使应用程序崩溃.

编辑:

exit(0) 也会做的伎俩


Cou*_*per 9

int* p = 0;
*p = 0;
Run Code Online (Sandbox Code Playgroud)

给了一个 EXC_BAD_ACCESS (code=2, address=0x0)

编辑:

在Greg Parkers评论允许编译器优化上述陈述之后,它让我更加彻底地思考上述陈述,以及为什么Greg Parker是对的:

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

这意味着,上述语句的效果取决于编译器.这种"未定义的行为"也意味着,允许编译器应用一些优化,这可能会使上述语句"被优化掉" - 正如Greg Parker断言的那样.

那么,现在这让我很好奇clang实际会做什么:

这是一个小测试程序:

int main(int argc, const char * argv[])
{
    int* p = 0;
    *p = 0;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

优化设置为"-Ofast",我们得到这个反汇编:

0x100000f90:  pushq  %rbp
0x100000f91:  movq   %rsp, %rbp
0x100000f94:  ud2    
Run Code Online (Sandbox Code Playgroud)

其中ud2一个操作码意味着"未定义的操作码"并导致CPU异常:

`EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)`
Run Code Online (Sandbox Code Playgroud)

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

虽然这很有趣,但它仅指"取消引用NULL指针".如果我们改为:

int* p = (int*)1;
*p = 0;
Run Code Online (Sandbox Code Playgroud)

程序按预期崩溃 - 但需要硬件拒绝写入此(无效)地址的"先决条件".


Chr*_*sJF 6

我经常发现让应用程序启动,做一些事情,然后在 10 秒后崩溃很有用。在这种情况下(对于Objective-C),我使用:

[self performSelector:NSSelectorFromString(@"crashme:") withObject:nil afterDelay:10];
Run Code Online (Sandbox Code Playgroud)

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

斯威夫特

self.perform("crashme:", with: nil, afterDelay: 10)
Run Code Online (Sandbox Code Playgroud)


And*_*ini 6

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

斯威夫特4

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

目标-C

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

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