我想测试一下我的崩溃分析。我没有意识到有意让应用程序崩溃是多么困难的事情。在编程过程中,看起来很简单。是否有人有建议可以强制我的应用程序崩溃?我不是指"内存错误"这种小型崩溃,而是手机不知道该怎么办。我需要它至少作为崩溃进入设备日志,在Xcode的组织者中显示。有什么建议吗?
我想测试一下我的崩溃分析。我没有意识到有意让应用程序崩溃是多么困难的事情。在编程过程中,看起来很简单。是否有人有建议可以强制我的应用程序崩溃?我不是指"内存错误"这种小型崩溃,而是手机不知道该怎么办。我需要它至少作为崩溃进入设备日志,在Xcode的组织者中显示。有什么建议吗?
@throw NSInternalInconsistencyException;
terminate()
将被调用,进而调用abort()
。严格来说,程序不会崩溃,而是_终止_。 - CouchDeveloper有很多种方法可以终止一个应用程序!这里有两个一行命令:
[self performSelector:@selector(die_die)];
同样也
@[][666];
exit
不会导致崩溃。 - rmaddy只需编写assert(NO)
。这将检查作为参数给定的条件,如果为假,则使应用程序崩溃。
编辑:
exit(0)
也可以实现相同的效果。
int* p = 0;
*p = 0;
出现 EXC_BAD_ACCESS (code=2, address=0x0)
错误。
编辑:
在 Greg Parker 的评论中,他指出编译器可以优化上述语句,这让我更加深入地思考了以上语句的原因:
事实上,在 C 和 C++ 中 解引用 NULL 指针 是“未定义行为”(也参见 C99 §6.5.3.2/4)。
这意味着,以上语句的效果取决于编译器。这种“未定义行为”还意味着编译器可以应用几种优化,这些优化可能导致以上语句被“优化掉”,正如 Greg Parker 所断言的那样。
现在,这让我很好奇 clang 到底会做什么:
这是一个小测试程序:
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;
程序会如预期一样崩溃 - 但需要“前提条件”,即硬件拒绝对此(无效)地址进行写入。
@throw NSInternalInconsistencyException;
可以解决您的问题,但它是一个异常(而不是崩溃),因此可能会被捕获。我经常发现让应用程序启动,执行一段时间后在10秒后崩溃非常有用。在这种情况下(对于Objective-C),我使用以下代码:
[self performSelector:NSSelectorFromString(@"crashme:") withObject:nil afterDelay:10];
self.perform("crashme:", with: nil, afterDelay: 10)
@throw [NSException exceptionWithName:NSGenericException reason:@"" userInfo:nil];
请查看NSException.h
以获取更多异常信息。对于Swift,以下方法适用:
assert(false, "sdf")
And this:
var hey:[Int] = []
hey[0] = 1
*(long*)0 = 0xDEADBEEF;
出现EXC_BAD_ACCESS错误
NSArray *array = @[@1, @2]; NSNumber *number = [array objectAtIndex:2];
不会崩溃吗? - T. Benjamin Larsen