1. 程式人生 > >iOS應用崩潰日誌

iOS應用崩潰日誌

3、Exception(非常重要)

Exception Type:  EXC_CRASH (SIGABRT)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Exception Note:  EXC_CORPSE_NOTIFY
Triggered by Thread:  0

Exception Type 異常型別
Exception Subtype: 異常子型別
Crashed Thread 發生異常的執行緒號

 通過崩潰的型別,你可以分析你可以具體確認是什麼樣的問題,基本能定位到大致的問題發生的位置

4、Thread Backtrace

Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0   libsystem_kernel.dylib        0x0000000180c88140 0x180c6c000 + 115008
1   libsystem_pthread.dylib       0x0000000180d50ef8 0x180d4c000 + 20216
2   libsystem_c.dylib             0x0000000180bf9dac 0x180b98000 + 400812
3   libc++abi.dylib               0x000000018072d3f4 0x18072c000 + 5108
4   libc++abi.dylib               0x0000000180749e98 0x18072c000 + 122520
5   libobjc.A.dylib               0x0000000180754248 0x18074c000 + 33352
6   libc++abi.dylib               0x0000000180746f44 0x18072c000 + 110404
7   libc++abi.dylib               0x0000000180746b10 0x18072c000 + 109328
8   libobjc.A.dylib               0x0000000180754120 0x18074c000 + 33056
9   CoreFoundation                0x0000000180fc9728 0x180fc0000 + 38696
10  GraphicsServices              0x00000001824d8088 0x1824cc000 + 49288
11  UIKit                         0x0000000185e40d90 0x185dc4000 + 511376
12  newbaichuanzhongyun           0x000000010012b100 0x100094000 + 618752
13  libdyld.dylib                 0x0000000180b6a8b8 0x180b68000 + 10424

發生Crash的執行緒的Crash呼叫棧,從上到下分別代表呼叫順序,最上面的一個表示丟擲異常的位置,依次往下可以看到API的呼叫順序。


二、常見的Crash型別

1、Watchdog timeout

Exception Code:0x8badf00d, 不太直觀,可以讀成“eat bad food”,意思是don‘t block main thread

緊接著下面會有一段描述:

Application Specific Information:

com.xxx.yyy   failed to resume in time

對於此類Crash,我們應該去審視自己App初始化時做的事情是否正確,是否在主執行緒請求了網路,或者其他耗時的事情卡住了正常初始化流程。

通常系統允許一個App從啟動到可以相應使用者事件的時間最多為5S,如果超過了5S,App就會被系統終止掉。在Launch,resume,suspend,quit時都會有相應的時間要求。在Highlight Thread裡面我們可以看到被終止時呼叫到的位置,xxxAppDelegate加上行號。 

PS. 在連線Xcode除錯時為了便於除錯,系統會暫時禁用掉Watchdog,所以此類問題的發現需要使用正常的啟動模式

2、User force-quit

Exception Codes: 0xdeadfa11, deadfall

這個強制退出跟我們平時所說的kill掉後臺任務操作還不太一樣,通常在程式bug造成系統無法響應時可以採用長按電源鍵,當螢幕出現關機確認畫面時按下Home鍵即可關閉當前程式。

3、Low Memory termination

跟一般的Crash結構不太一樣,通常有Free pages,Wired Pages,Purgeable pages,largest process 組成,同事會列出當前時刻系統執行所有程序的資訊。

App在執行過程中,系統記憶體緊張時通常會先發警告,同時把後臺掛起的程式終止掉,最終如果還是記憶體不夠的話就會終止掉當前前臺的程序。

當接受到記憶體警告的事後,我們應該釋放盡可能多的記憶體,Crash其實也可以看做是對App的一種保護。

4、Crash due to bugs

因為程式bug導致的Crash通常千奇百怪,很難一概而論。大部分情況通過Crash日誌就可以定位出問題,當然也不排除部分疑難雜症看半天都不值問題出在哪兒。這個就只能看功底了,一點點找,總是能發現蛛絲馬跡。是在看不出來時還可以求助於Google大神,總有人遇到和你一樣的Bug 

三、常見的Exception Type 

1、Exception Type

1)EXC_BAD_ACCESS

此型別的Excpetion是我們最長碰到的Crash,通常用於訪問了不改訪問的記憶體導致。一般EXC_BAD_ACCESS後面的"()"還會帶有補充資訊。

SIGSEGV: 通常由於重複釋放物件導致,這種型別在切換了ARC以後應該已經很少見到了。

SIGABRT:  收到Abort訊號退出,通常Foundation庫中的容器為了保護狀態正常會做一些檢測,例如插入nil到陣列中等會遇到此類錯誤。

SEGV:(Segmentation  Violation),代表無效記憶體地址,比如空指標,未初始化指標,棧溢位等;

SIGBUS:匯流排錯誤,與 SIGSEGV 不同的是,SIGSEGV 訪問的是無效地址,而 SIGBUS 訪問的是有效地址,但匯流排訪問異常(如地址對齊問題)

SIGILL:嘗試執行非法的指令,可能不被識別或者沒有許可權

2)EXC_BAD_INSTRUCTION

此類異常通常由於執行緒執行非法指令導致

3)EXC_ARITHMETIC

除零錯誤會丟擲此類異常