Xcode查看iOS崩潰與崩潰日志分析


一、造成崩潰的原因

1、代碼中存在bug

2、Watchdog 超時機制

3、用戶強制退出

4、低內存終止

5、其他違法系統規則的操作,大部分是內存問題

 

二、崩潰的類型

1、信號錯誤類

(1)EXC_BAD_ACCESS

 

 

(2)SIGSEVG

 (3)SIGBUS

 

 

 

(4)SIGTRAP

 

 

 

(5)EXC_ARITHETIC

 

 

 

(6)SIGILL

 

 

 

(7)SIGABRT

 

 

 

 

(8)Watchdog 超時

 

 

 2、異常類

(1)NSRangeException(越界異常)

  NSRangeException是iOS開發比較常見的異常。造成異常的原因主要有以下幾點:

  a、使用的數組小標超出數組最大下標值

    比如數組長度count, index的下標范圍[0, count -1], 在開發時,可能index的最大值超過數組的范圍。

  b、使用的數組小標是一個非正常值

    如果小標(index)的值是由其他模塊的變量傳遞進來的,這就會有很大的不確定性, 可能是一個很大的整數值。

    

     

     很明顯,上面的值分別是32位和64位下的最大整數值,可能的情況就是傳遞的index參數獲取了無效的值,但仍然拿到NSMutableArray中使用

  比如index通過下面的方式獲取。如果找不到str ,則返回NSNotFound,32位下它就是2147483647,64位下18446744073709551615 ,將它作為參數傳遞則會導致             NSRangeException。

  c、空數組的操作

    如果一個數組剛剛初始化,還是空的,就對它進行相關讀取操作,會造成異常。

    

  d、處理的數據范圍 NSRange 超過數據本身的長度

    

(2)NSException

三、崩潰日志的獲取

  如下圖:

  

 

 

 

 

四、崩潰日志解析

1、崩潰日志的實例

  

下面是一份測試過程產生的崩潰日志
//進程信息
Incident Identifier: 3C3F8BF8-3099-4E82-92E1-8690212E8FF9
CrashReporter Key:   bb5f9839ae661ab755f25eff65fee8fd41369628
Hardware Model:      iPod5,1
Process:             demo [973]
Path:                /private/var/containers/Bundle/Application/0D3657DE-DE1E-4FF0-A0F7-C09EBC002763/demo.app/demo
Identifier:          com.yanghuang.demo
Version:             17 (1.1.9)
Code Type:           ARM (Native)
Parent Process:      launchd [1]
//基本信息
Date/Time:           2017-08-22 16:11:49.49 +0800
Launch Time:         2017-08-22 16:11:40.40 +0800
OS Version:          iOS 9.3.5 (13G36)
Report Version:      104
//異常
Exception Type:  EXC_BREAKPOINT (SIGTRAP)
Exception Codes: 0x0000000000000001, 0x00000000e7ffdefe
Triggered by Thread:  0

Filtered syslog:
None found
//線程回溯
Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0   libswiftCore.dylib              0x0033788c 0x1ac000 + 1620108
1   ...wiftSwiftOnoneSupport.dylib  0x009b4830 0x9ac000 + 34864
2   demo                            0x00029288 0x24000 + 21128
3   demo                            0x00029414 0x24000 + 21524
4   UIKit                           0x25cd2754 0x25c87000 + 309076
5   UIKit                           0x25cd26e0 0x25c87000 + 308960
6   UIKit                           0x25cba6d2 0x25c87000 + 210642
7   UIKit                           0x25cd2004 0x25c87000 + 307204
8   UIKit                           0x25cd1c7e 0x25c87000 + 306302
9   UIKit                           0x25cca68e 0x25c87000 + 276110
10  UIKit                           0x25c9b124 0x25c87000 + 82212
11  UIKit                           0x25c996d2 0x25c87000 + 75474
12  CoreFoundation                  0x216e1dfe 0x21626000 + 769534
13  CoreFoundation                  0x216e19ec 0x21626000 + 768492
14  CoreFoundation                  0x216dfd5a 0x21626000 + 761178
15  CoreFoundation                  0x2162f228 0x21626000 + 37416
16  CoreFoundation                  0x2162f014 0x21626000 + 36884
17  GraphicsServices                0x22c1fac8 0x22c16000 + 39624
18  UIKit                           0x25d03188 0x25c87000 + 508296
19  demo                            0x0002ff48 0x24000 + 48968
20  libdyld.dylib                   0x212d7872 0x212d5000 + 10354

Thread 1 name:  Dispatch queue: com.apple.libdispatch-manager
Thread 1:
0   libsystem_kernel.dylib          0x213ac2f8 0x21396000 + 90872
1   libdispatch.dylib               0x212a1d60 0x2128b000 + 93536
2   libdispatch.dylib               0x212a1abe 0x2128b000 + 92862

... 省略部分內容

//二進制映像
Binary Images
0x24000 - 0x33fff demo armv7   /var/containers/Bundle/Application/0D3657DE-DE1E-4FF0-A0F7-C09EBC002763/demo.app/demo
0x140000 - 0x15bfff Masonry armv7  <9615e97c54d335f7821568396c65d324> /var/containers/Bundle/Application/0D3657DE-DE1E-4FF0-A0F7-C09EBC002763/demo.app/Frameworks/Masonry.framework/Masonry

2、進程信息

第一部分是閃退進程的相關信息。

Incident Identifier 是崩潰報告的唯一標識符。

CrashReporter Key 是與設備標識相對應的唯一鍵值。雖然它不是真正的設備標識符,但也是一個非常有用的情報:如果你看到100個崩潰日志的CrashReporter Key值都是相同的,或者只有少數幾個不同的CrashReport值,說明這不是一個普遍的問題,只發生在一個或少數幾個設備上。

Hardware Model 標識設備類型。 如果很多崩潰日志都是來自相同的設備類型,說明應用只在某特定類型的設備上有問題。上面的日志里,崩潰日志產生的設備是iPhone 4s。

Process 是應用名稱。中括號里面的數字是閃退時應用的進程ID。

3、基本信息

  

這部分給出了一些基本信息,包括閃退發生的日期和時間,設備的iOS版本。如果有很多崩潰日志都來自iOS 6.0,說明問題只發生在iOS 6.0上。

Version: 崩潰進程的版本號. 這個值包含在 CFBundleVersion and CFBundleVersionString中。

Code Type: 崩潰日志所在設備的架構. 會是ARM-64, ARM, x86-64, or x86中的一個。

OS Version: 崩潰發生時的系統版本。

4、異常信息

  

異常信息會列出異常的類型、位置。

在這部分,你可以看到閃退發生時拋出的異常類型。還能看到異常編碼和拋出異常的線程。根據崩潰報告類型的不同,在這部分你還能看到一些另外的信息。

Exception Codes: 處理器的具體信息有關的異常編碼成一個或多個64位進制數。通常情況下,這個區域不會被呈現,因為將異常代碼解析成人們可以看懂的描述是在其它區域進行的。

Exception Subtype: 供人們可讀的異常代碼的名字

Exception Message: 從異常代碼中提取的額外的可供人們閱讀的信息.

Exception Note: 不是特定於一個異常類型的額外信息.如果這個區域包含SIMULATED (這不是一個崩潰)然后進程沒有崩潰,但是被watchdog殺掉了

Termination Reason: 當一個進程被終止的時的原因。

Triggered by Thread: 異常所在的線程.

5、線程回溯

  

這部分提供應用中所有線程的回溯日志。 回溯是閃退發生時所有活動幀清單。它包含閃退發生時調用函數的清單。看下面這行日志:

2   demo     0x00029288 0x24000 + 21128

它包括四列:

幀編號—— 此處是2。

二進制庫的名稱 ——此處是 demo.

調用方法的地址 ——此處是 0x00029288.

第四列分為兩個子列,一個基本地址和一個偏移量。此處是0×0x24000 + 21128, 第一個數字指向文件,第二個數字指向文件中的代碼行。

6、二進制映像

 
        

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM