136

実際のユーザーが誤って実行する可能性が低い特定のアクションをユーザーが実行したときに、意図的にアプリをクラッシュさせて、アプリのクラッシュ レポートを現場でテストしたいと考えています。

しかし、コンパイル時に警告を出さずにアプリをクラッシュさせる信頼できる方法は何ですか?

編集:この質問に対する一見明白な回答の多くは、Cocoa によってキャッチされる例外が発生するため、アプリがクラッシュすることはないことに注意してください。

4

18 に答える 18

141

Objective-Cでは、Cを直接使用して不正なアクセスを引き起こします

strcpy(0, "bla");

注:これは私が知っているどのシステムでも機能しますが、Cランタイムまたはコンパイラの将来のバージョンでは、これでクラッシュが発生しなくなる可能性があります。ヌルポインタはObjective-Cの未定義の動作を逆参照していますか?を参照してください。)。

(迅速にこれを行うには、objCにブリッジする必要があります)

于 2012-11-22T10:36:46.613 に答える
27

私たちは皆 Clang for iOS を使用しているので、これはかなり信頼できます。

__builtin_trap();

これには、まさにこの目的のために設計されているという利点があるため、コンパイラの警告やエラーは生成されません。

于 2012-11-23T04:14:19.537 に答える
25

古き良きスタックオーバーフローはどうですか:)

- (void)stackOverflow
{
    [self stackOverflow];
}
于 2014-01-28T19:07:52.340 に答える
24

abort();異常終了… クラッシュです。

于 2012-11-22T15:11:26.390 に答える
16

最も一般的なもの - 認識されないセレクターのクラッシュ:

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

-asdf メソッドがそのクラスに実装されていないことを確認してください (笑)

または、バインドされた例外を超えたインデックス:

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

そしてもちろん kill( getpid(), SIGABRT );

于 2012-11-22T10:37:37.580 に答える
13

Swift では、致命的なエラーを簡単にスローできると思います。

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

アプリをクラッシュさせるために何か問題が発生した場合に備えて、実際にはこの機能を使用することさえ意図されています.

特殊なケースで if ステートメントを避けるために、 も使用できますprecondition。これは に似ている assertため、(必要に応じて) 意図が明確になり、最終リリースでは として削除されませんassert。のように使われprecondition(myBoolean, "This is a helpful error message for debugging.")ます。

于 2015-03-01T11:57:53.043 に答える
9

割り当て解除されたオブジェクトにメッセージを送信する

于 2012-11-22T10:27:28.990 に答える
7
exit(0);

(必ず...タイプ... 30文字)

于 2012-11-28T00:08:02.273 に答える
6

例外を発生させることもできます。

[NSException raise:NSInternalInconsistencyException
            format:@"I want to test app crashes!."];
于 2012-11-22T10:34:33.617 に答える
3

10 本の指でのタップを認識するビューにジェスチャ レコグナイザーを追加します (iPhone の場合は 5 本の指で、10 本の指は少し混雑する可能性があります)。GR には、前述のアプリをクラッシュさせる確実な方法のいずれかを実行するメソッドがアタッチされています。ほとんどのユーザーはアプリに 10 本の指を置きません。そのため、一般ユーザーが誤ってクラッシュを引き起こすことはありません。

ただし、Testflight のようなものを使用するか、それを個人のデバイスにデプロイして、Apple に提出する前に実際にテストすることができるはずです。強制的なクラッシュが発生すると、アプリが Apple によって拒否される可能性があります。

于 2012-11-27T19:43:27.303 に答える
1

私は一緒に行きます:int raise(int sig);

詳細情報を取得するには>man raise

于 2012-11-22T12:37:49.640 に答える
0

RubyMotion を使用するときは、これを使用します。

    n=Pointer.new ('c', 1)
    n[1000] ='h'
于 2015-03-05T16:29:24.633 に答える
0

私が使う

[self doesNotRecognizeSelector:_cmd]; 
于 2014-06-04T13:42:37.670 に答える
0

私はプロセスを普通に殺すだけです:

kill(getpid(), SIGKILL);

したがって、シグナル付きのハンドラーをインストールすると、クラッシュを処理して、開いているファイルの書き込みなどを終了することもできます。

于 2012-12-14T02:07:16.090 に答える
-1

間違ったNSLogステートメントはそれを行います

NSLog(@"%@",1);
于 2012-12-23T10:40:48.257 に答える