强制iOS应用崩溃的最快方法是什么? 我正在尝试测试我的崩溃分析。我没有意识到随意崩溃是多么困难。似乎是如此简单的中间编程。有人建议我如何强制我的应用程序...

问题描述 投票:0回答:7
@throw NSInternalInconsistencyException;

ios objective-c crash-reports flurry
7个回答
94
投票
杀死应用程序的多种方法!这是两个衬里:
[self performSelector:@selector(die_die)];

25
投票
so

@[][666];
    

刚写
assert(NO)
。这将检查给定的条件为参数,如果应用程序为false。

14
投票
Edit:

exit(0)

还将做技巧

int* p = 0; *p = 0;

gives a

EXC_BAD_ACCESS (code=2, address=0x0)

11
投票
Edit:

格雷格·帕克斯(Greg Parkers)评论说,允许编译器优化上述陈述,这使我对上述陈述进行了更彻底的思考,以及格雷格·帕克(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

where

ud2

是一个opcode,意为“未定义的opcode”,并导致CPU例外:
`EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)`

(也许@gregparker可以评论为什么clang选择这种方法?)
尽管这很有趣,但它指的是“删除零指针”。如果我们有这个:

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

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

我认为范围内的好旧数组索引保证了“成功崩溃”,因此在这里我最喜欢的列表:

swift4

[][0]


10
投票

fatalError()

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

尽管解决了您的问题,但是一个例外(不是崩溃),因此可能是caught的。
  1. 我经常发现启动应用程序,做一些事情,然后在10秒后崩溃很有用。在这种情况下(对于Objective-C
    ),我使用:
  2. @throw NSInternalInconsistencyException;
    对此的次要好处是,编译器不会对未找到选择器提出任何警告(如果使用Objective-C)。 :)
  3. swift

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

    
更受控的方法是实际提出一个例外:


6
投票
self.perform("crashme:", with: nil, afterDelay: 10)

检查更多例外。

对于Swift,这些对我有用:

@throw [NSException exceptionWithName:NSGenericException reason:@"" userInfo:nil];

和此:

NSException.h
    

3
投票
💣💣

assert(false, "sdf")

givesexc_bad_access

	

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.