Kat*_*hai 41 objective-c crash-reports flurry ios
我正在尝试测试我的崩溃分析.我没有意识到让应用程序崩溃是多么困难.中编程似乎很简单.有没有人建议我如何强迫我的应用程序崩溃?我并不是说有一点"内存错误"崩溃,我的意思是手机不知道该如何处理自己.在Xcode的组织者中,我至少需要它作为崩溃进入设备日志.有什么建议?
Sta*_*ash 76
@throw NSInternalInconsistencyException;
Run Code Online (Sandbox Code Playgroud)
fsa*_*int 18
杀死应用程序的方法很多!这是两个一个衬垫:
[self performSelector:@selector(die_die)];
Run Code Online (Sandbox Code Playgroud)
也
@[][666];
Run Code Online (Sandbox Code Playgroud)
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)
程序按预期崩溃 - 但需要硬件拒绝写入此(无效)地址的"先决条件".
我经常发现让应用程序启动,做一些事情,然后在 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)