[英]What's a reliable way to make an iOS app crash?
我想在用戶執行真實用戶不太可能意外執行的特定操作時故意讓它崩潰,從而在現場測試我的應用程序崩潰報告。
但是什么是使編譯時不會產生警告的應用程序崩潰的可靠方法?
編輯:請注意,這個問題的許多看似明顯的答案導致Cocoa捕獲的異常,因此不會導致應用程序崩潰。
在Objective-C中直接使用C導致訪問不良
strcpy(0, "bla");
注意:雖然這適用於我所知道的任何系統 - 在未來版本的C運行時或編譯器中,這可能不會導致崩潰。 請參閱Objective-C中的空指針取消引用未定義行為? )
(在swift中,你必須橋接到objC才能做到這一點)
我目前最喜歡的:
assert(! "crashing on purpose to test <insert your reason here>");
經典之作:
kill( getpid(), SIGABRT );
還有一些pr0n:
*(long*)0 = 0xB16B00B5;
所有這些都會導致我的崩潰報告工具捕獲崩潰。
由於我們都使用Clang for iOS,這是相當可靠的:
__builtin_trap();
這樣做的好處是它專門用於此目的,因此不應生成任何編譯器警告或錯誤。
abort();
導致異常終止......那是一次崩潰。
一個好的舊堆棧怎么樣溢出:)
- (void)stackOverflow
{
[self stackOverflow];
}
最受歡迎的一個 - 無法識別的選擇器崩潰:
NSObject *object = [[NSObject alloc] init];
[object performSelector:@selector(asfd)];
確保你沒有在該類中實現-asdf方法哈哈
或索引超出綁定異常:
NSArray * array = [NSArray array];
[array objectAtIndex:5];
當然還有kill( getpid(), SIGABRT );
我認為在Swift中你很容易拋出一個致命的錯誤:
func foo() {
fatalError("crash!")
}
它實際上甚至打算使用此功能,以防出現問題,以使應用程序崩潰。
要避免在特殊情況下使用if語句,您也可以使用precondition
。 它與assert
類似,因此意圖(如果需要)非常明確,並且在最終版本中不會作為assert
刪除。 它像precondition(myBoolean, "This is a helpful error message for debugging.")
一樣使用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個手指,因此您可以安全地避免一般用戶意外導致崩潰。
但是,您應該能夠使用像Testflight這樣的東西,或者只是將它部署到個人設備上,然后在將它提交給Apple之前在野外進行測試。 強制崩潰可能會讓Apple拒絕您的應用。
可以試試像
NSArray* crashingArray = [NSArray arrayWithCapacity:1];
[crashingArray release];
應該在EXC_BAD_ACCESS上崩潰(可能需要第二次釋放它,但正常情況下它應該像這樣崩潰)
我將使用: int raise(int sig);
獲取更多信息>man raise
我會正常殺死這個過程:
kill(getpid(), SIGKILL);
因此,如果您安裝帶有信號的處理程序,您也可以處理崩潰,完成寫入打開的文件和這些事情。
我用
[self doesNotRecognizeSelector:_cmd];
使用RubyMotion時我使用:
n=Pointer.new ('c', 1)
n[1000] ='h'
試試這個:
- (IBAction)Button:(id)sender
{
NSArray *array = [NSArray new];
NSLog(@"%@",[array objectAtIndex:8]);
}
一個錯誤的NSLog
語句就可以了
NSLog(@"%@",1);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.