1. 程式人生 > >ios中的奇怪崩潰Signal和EXC_BAD_ACCESS錯誤分析

ios中的奇怪崩潰Signal和EXC_BAD_ACCESS錯誤分析

奔潰 ges bad strong 分享圖片 bject 文章 原子 exc

什麽是Signal

在計算機科學中,信號(英語:Signals)是Unix、類Unix以及其他POSIX兼容的操作系統中進程間通訊的一種有限制的方式。它是一種異步的通知機制,用來提醒進程一個事件已經發生。當一個信號發送給一個進程,操作系統中斷了進程正常的控制流程,此時,任何非原子操作都將被中斷。如果進程定義了信號的處理函數,那麽它將被執行,否則就執行默認的處理函數。

在iOS中就是未被捕獲的Objective-C異常(NSException),導致程序向自身發送了SIGABRT信號而崩潰。

Signal信號的類型

SIGABRT–程序中止命令中止信號
SIGALRM–程序超時信號
SIGFPE–程序浮點異常信號
SIGILL–程序非法指令信號
SIGHUP–程序終端中止信號
SIGINT–程序鍵盤中斷信號
SIGKILL–程序結束接收中止信號
SIGTERM–程序kill中止信號
SIGSTOP–程序鍵盤中止信號
SIGSEGV–程序無效內存中止信號
SIGBUS–程序內存字節未對齊中止信號
SIGPIPE–程序Socket發送失敗中止信號
iOS異常捕獲這篇文章中有對各種信號的解釋。

SIGABRT

就crash而言,SIGABRT是一個比較好解決的,因為他是一個可掌控的crash。App會在一個目的地終止,因為系統意識到app做了一些他不能支持的事情。

通常, SIGABRT 異常是由於某個對象接收到未實現的消息引起的。 或者,用簡單的話說,在某個對象上調用了不存在的方法。

SIGSEGV

SIGSEGV程序無效內存中止信號,一般是表示內存不合法,

SIGBUS

SIGBUS程序內存字節未對齊中止信號,

截取Signal和Exception從容的崩潰

一個不錯的崩潰遠嗎,集成到項目中能捕獲崩潰信息 DSSignalHandlerDemo
這是一個防止奔潰的源碼,可以使一些原本會奔潰的操作彈出UIAlertView。裏面寫了兩種信號量的崩潰:SIGSEGV、SIGABRT,還有一些信號大家可以寫上去提個PR給我。

下圖為源碼的運行圖,其中Signal中的Signal(EGV)第一次點擊的時候能彈出alert,如果第二次點擊就沒有崩潰和alert,感覺像卡死一樣。

而Signal(BRT)中的這種信號錯誤多次點擊也是沒有問題的還是能繼續下去。個人猜測可能是SIGSEGV這種信號錯誤會導致了整個進程掛了。

註意:測試的時候如果測試Signal類型的崩潰,不要在xcode下的debug模式進行測試。因為系統的debug會優先去攔截。應該build好應用之後直接點擊運行app進行測試。

技術分享圖片

ios中的奇怪崩潰Signal和EXC_BAD_ACCESS錯誤分析