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 BacktraceThread 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
除零錯誤會丟擲此類異常