什么是使iOS应用程序崩溃的可靠方法?

时间:2012-11-22 10:25:07

标签: iphone objective-c ios

我想测试我的应用程序崩溃报告,因为当用户执行一个真实用户不太可能意外执行的特定操作时故意让它崩溃。

但是什么是使编译时不会产生警告的应用程序崩溃的可靠方法?

编辑:请注意,对此问题的许多看似明显的答案会导致Cocoa捕获异常,从而导致应用程序崩溃。

18 个答案:

答案 0 :(得分:138)

Objective-C中的

直接使用C导致访问不良

strcpy(0, "bla");

注意:虽然这适用于我所知道的任何系统 - 在未来版本的C运行时或编译器中,这可能不会导致崩溃。见Is null pointer dereference undefined behavior in Objective-C?

(在swift中,您必须桥接到objC来执行此操作)

答案 1 :(得分:95)

我目前的最爱:

assert(! "crashing on purpose to test <insert your reason here>");

经典之作:

kill( getpid(), SIGABRT );

还有一些人:

*(long*)0 = 0xB16B00B5;

所有这些都会导致崩溃报告工具捕获崩溃。

答案 2 :(得分:26)

由于我们都使用Clang for iOS,因此相当可靠:

__builtin_trap();

这样做的好处是它专门用于此目的,因此不应生成任何编译器警告或错误。

答案 3 :(得分:24)

abort();导致异常终止......这是一次崩溃。

答案 4 :(得分:20)

好的旧堆栈如何溢出:)

- (void)stackOverflow
{
    [self stackOverflow];
}

答案 5 :(得分:16)

最受欢迎的一个 - 无法识别的选择器崩溃:

NSObject *object = [[NSObject alloc] init];
[object performSelector:@selector(asfd)];

确保你没有在该类中实现-asdf方法haha

或超出绑定异常的索引:

NSArray * array = [NSArray array];
[array objectAtIndex:5];

当然 kill( getpid(), SIGABRT );

答案 6 :(得分:9)

我认为在Swift中你很容易抛出一个致命的错误:

func foo() {
    fatalError("crash!")
}

实际上甚至打算使用此功能以防出现问题以使应用程序崩溃。

为避免在特殊情况下使用if语句,您也可以使用precondition。它与assert类似,因此意图(如果需要)非常明确,并且在最终版本中 not 被移除为assert。它像precondition(myBoolean, "This is a helpful error message for debugging.")一样使用。

答案 7 :(得分:9)

向已解除分配的对象发送消息

答案 8 :(得分:7)

exit(0);

(必须......输入... 30个字符)

答案 9 :(得分:6)

您还可以提出异常:

[NSException raise:NSInternalInconsistencyException
            format:@"I want to test app crashes!."];

答案 10 :(得分:3)

将手势识别器添加到识别10个手指点击的视图中(iPhone的5个手指,因为10可能会有点拥挤)。 GR有一个附加到它的方法,它执行前面提到的任何一种确定方法来让你的应用程序崩溃。大多数用户不会在您的应用上放下10个手指,因此您可以避免一般用户意外导致崩溃。

但是,您应该能够使用像Testflight这样的东西,或者只是将其部署到个人设备上,然后在将其提交给Apple之前进行测试。强制崩溃可能会让Apple拒绝您的应用。

答案 11 :(得分:2)

可以尝试像

这样的东西
NSArray* crashingArray = [NSArray arrayWithCapacity:1];
[crashingArray release];

应该在EXC_BAD_ACCESS上崩溃(可能需要第二次释放它,但正常情况下它应该像这样崩溃)

答案 12 :(得分:1)

我会选择:int raise(int sig);

获取更多信息>man raise

答案 13 :(得分:0)

我会正常杀死这个过程:

kill(getpid(), SIGKILL);

因此,如果您安装带有信号的处理程序,您也可以处理崩溃,完成编写打开的文件和这些事情。

答案 14 :(得分:0)

我用

[self doesNotRecognizeSelector:_cmd]; 

答案 15 :(得分:0)

使用RubyMotion时,我使用:

    n=Pointer.new ('c', 1)
    n[1000] ='h'

答案 16 :(得分:0)

试试这个:

- (IBAction)Button:(id)sender
{
    NSArray *array = [NSArray new];
    NSLog(@"%@",[array objectAtIndex:8]);
}

答案 17 :(得分:-1)

错误的NSLog语句会执行此操作

NSLog(@"%@",1);
相关问题