実際のユーザーが誤って行う可能性が低い特定のアクションをユーザーが実行したときに意図的にクラッシュさせることにより、アプリのクラッシュレポートをフィールドでテストしたいと思います。
しかし、コンパイル時に警告を出さない、アプリをクラッシュさせる信頼できる方法は何でしょうか?
編集:この質問に対する一見明白な答えの多くは、Cocoaによってキャッチされる例外を発生させるため、アプリがクラッシュしないことに注意してください。
(void)0/0;
、(void)*(char*)0;
実際のユーザーが誤って行う可能性が低い特定のアクションをユーザーが実行したときに意図的にクラッシュさせることにより、アプリのクラッシュレポートをフィールドでテストしたいと思います。
しかし、コンパイル時に警告を出さない、アプリをクラッシュさせる信頼できる方法は何でしょうか?
編集:この質問に対する一見明白な答えの多くは、Cocoaによってキャッチされる例外を発生させるため、アプリがクラッシュしないことに注意してください。
(void)0/0;
、(void)*(char*)0;
回答:
Objective-Cでは、Cを直接使用して不正なアクセスを引き起こします
strcpy(0, "bla");
注:これは私が知っているすべてのシステムで機能しますが、Cランタイムまたはコンパイラの将来のバージョンでは、これによりクラッシュが発生しなくなる可能性があります。ご覧のObjective-Cで未定義の動作を逆参照されるヌルポインタを?)
(これを行うには、objCにブリッジする必要があります)
WebKit discarded an uncaught exception
も問題を回避します。
私の現在のお気に入り:
assert(! "crashing on purpose to test <insert your reason here>");
クラシック:
kill( getpid(), SIGABRT );
そしていくつかのpr0n:
*(long*)0 = 0xB16B00B5;
それらすべてが、私のクラッシュレポートツールでキャプチャされたクラッシュを生成します。
assert()
デバッグ機能です。リリースビルドにそのような残骸を残しても意味がありません。そのための単体テストがあります。
assert
はデバッグ機能ではありません。失敗したアサートは、あなたが不可能だと思ったバグです。予測できない結果をもたらすプログラムを実行し続けるよりも、リリースビルドでさえ、中止する方が良いです。
私たちはすべてClang for iOSを使用しているため、これはかなり信頼できます。
__builtin_trap();
これには、まさにこの目的のために設計されているという利点があるため、コンパイラの警告やエラーが生成されないはずです。
abort();
異常終了を引き起こします…それはクラッシュです。
私はSwiftでは簡単に致命的なエラーを投げることができると思います:
func foo() {
fatalError("crash!")
}
実際には、アプリがクラッシュするために何か問題が発生した場合に、この機能を使用することさえ意図されています。
特殊なケースでifステートメントを回避するにはprecondition
、も使用できます。これはに似て assert
いるため、意図が(必要な場合)かなり明確になり、最終リリースではとして削除されませんassert
。のように使用されprecondition(myBoolean, "This is a helpful error message for debugging.")
ます。
割り当て解除されたオブジェクトにメッセージを送信する
exit(0);
(必須...タイプ... 30文字)
例外を発生させることもできます:
[NSException raise:NSInternalInconsistencyException
format:@"I want to test app crashes!."];
10本の指のタップを認識するビューにジェスチャーレコグナイザーを追加します(iPhoneでは5本の指で10が少し混雑する可能性があります)。GRには、前述の確実な方法を実行してアプリをクラッシュさせるメソッドがアタッチされています。ほとんどのユーザーはアプリ上で10本の指を下に置くことはないので、一般ユーザーが誤ってクラッシュを引き起こしても安全です。
ただし、Appleに送信する前に、Testflightのようなものを使用したり、個人用デバイスに展開して実際にテストしたりできるはずです。強制クラッシュすると、アプリがAppleに拒否される可能性があります。
のようなものを試すことができます
NSArray* crashingArray = [NSArray arrayWithCapacity:1];
[crashingArray release];
EXC_BAD_ACCESSでクラッシュするはずです(2回目に解放する必要があるかもしれませんが、通常はすでにこのようにクラッシュするはずです)。
私は普通にプロセスを殺すでしょう:
kill(getpid(), SIGKILL);
したがって、シグナル付きのハンドラーをインストールすると、クラッシュを処理して、開いたファイルやこれらのものを書き終えることができます。
私が使う
[self doesNotRecognizeSelector:_cmd];
これを試して:
- (IBAction)Button:(id)sender
{
NSArray *array = [NSArray new];
NSLog(@"%@",[array objectAtIndex:8]);
}
WebKit discarded an uncaught exception
これまでのところ、これらのアイデアのすべてのために!最近、アプリをクラッシュさせるのが難しいことを誰が知っていましたか?