iOS Crash Log 分析(三)

來源:互聯網
上載者:User

標籤:

如果不知道怎麼擷取CrashLog 或者 Crash Log符號化請看這兩篇文章

如何擷取真機Crash Log 檔案

如何符號化Crash Log檔案

開啟Crash Log 會看到如下的資訊:

Incident Identifier: AF4F2C83-8F68-47EF-B5AA-F16B067B5DF4
CrashReporter Key:   5670de85ee1f0f3c904891536e81ec086ed4b35b
Hardware Model:      iPhone8,1
Process:             kidneyUser [896]
Path:                /private/var/containers/Bundle/Application/48C71AA1-EB99-49B1-ABD7-2903DBA8E394/kidneyUser.app/kidneyUser
Identifier:          kidneyDiseaseHospitalUser
Version:             1 (1.0)
Code Type:           ARM-64 (Native)
Parent Process:      launchd [1]

Date/Time:           2016-05-05 10:45:43.43 +0800
Launch Time:         2016-05-05 10:42:07.07 +0800
OS Version:          iOS 9.3.1 (13E238)
Report Version:      105

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

Filtered syslog:
None found

Last Exception Backtrace:
0   CoreFoundation                    0x181aeee38 __exceptionPreprocess + 124
1   libobjc.A.dylib                   0x181153f80 objc_exception_throw + 56
2   CoreData                          0x18393ab44 -[NSManagedObjectModel initWithContentsOfURL:] + 856
3   kidneyUser                        0x1002b81d8 0x1000d8000 + 1966552
4   kidneyUser                        0x1002b82dc 0x1000d8000 + 1966812
5   kidneyUser                        0x1002b86a0 0x1000d8000 + 1967776
6   kidneyUser                        0x1002b87cc 0x1000d8000 + 1968076
7   kidneyUser                        0x1002b8024 0x1000d8000 + 1966116
8   UIKit                             0x186cc9128 -[UIApplication _terminateWithStatus:] + 280
9   UIKit                             0x186ee7f08 __102-[UIApplication _handleApplicationDeactivationWithScene:shouldForceExit:transitionContext:completion:]_block_invoke2017 + 796
10  UIKit                             0x186eeafd8 _runAfterCACommitDeferredBlocks + 292
11  UIKit                             0x186ef8990 _cleanUpAfterCAFlushAndRunDeferredBlocks + 92
12  UIKit                             0x186c2a4a4 _afterCACommitHandler + 96
13  CoreFoundation                    0x181aa47b0 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 32
14  CoreFoundation                    0x181aa2554 __CFRunLoopDoObservers + 372
15  CoreFoundation                    0x181aa2984 __CFRunLoopRun + 928
16  CoreFoundation                    0x1819ccd10 CFRunLoopRunSpecific + 384
17  GraphicsServices                  0x1832b4088 GSEventRunModal + 180
18  UIKit                             0x186ca1f70 UIApplicationMain + 204
19  kidneyUser                        0x1002c71e8 0x1000d8000 + 2028008
20  libdyld.dylib                     0x18156a8b8 start + 4


Global Trace Buffer (reverse chronological seconds):
2.434148     AppleJPEG                     0x000000018354ea88 [0x12e203600] Releasing session



Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0   libsystem_kernel.dylib            0x000000018168811c __pthread_kill + 8
1   libsystem_pthread.dylib           0x0000000181754ef8 pthread_kill + 112
2   libsystem_c.dylib                 0x00000001815f9dac abort + 140
3   libc++abi.dylib                   0x000000018112d3f4 __cxa_bad_cast + 0
4   libc++abi.dylib                   0x0000000181149e98 default_unexpected_handler() + 0
5   libobjc.A.dylib                   0x0000000181154248 _objc_terminate() + 124
6   libc++abi.dylib                   0x0000000181146f44 std::__terminate(void (*)()) + 16
7   libc++abi.dylib                   0x0000000181146b10 __cxa_rethrow + 144
8   libobjc.A.dylib                   0x0000000181154120 objc_exception_rethrow + 44
9   CoreFoundation                    0x00000001819ccdb8 CFRunLoopRunSpecific + 552
10  GraphicsServices                  0x00000001832b4088 GSEventRunModal + 180
11  UIKit                             0x0000000186ca1f70 UIApplicationMain + 204
12  kidneyUser                        0x00000001002c71e8 0x1000d8000 + 2028008

13  libdyld.dylib                     0x000000018156a8b8 start + 4

以上就是Crash Log 檔案的資訊(裝置的資訊, crash資訊,異常資訊, 線程資訊)

1. 裝置資訊

Incident Identifier: AF4F2C83-8F68-47EF-B5AA-F16B067B5DF4   // crash的ID
CrashReporter Key:   5670de85ee1f0f3c904891536e81ec086ed4b35b   // crash 的裝置ID
Hardware Model:      iPhone8,1   // 手機的型號 (iPhone8,1代表iPhone6s  8,2 代表iPhone6s Plus)
Process:             kidneyUser [896]   // App的名稱 (該App的進程ID)
Path:                /private/var/containers/Bundle/Application/48C71AA1-EB99-49B1-ABD7-2903DBA8E394/kidneyUser.app/kidneyUser         // APP 的位置 路徑
Identifier:          kidneyDiseaseHospitalUser // bundle ID
Version:             1 (1.0)   // APP的版本號碼
Code Type:           ARM-64 (Native) // app的應用架構
Parent Process:      launchd [1]

Date/Time:           2016-05-05 10:45:43.43 +0800      // crash發生的時間
Launch Time:         2016-05-05 10:42:07.07 +0800    // 進入應用的時間
OS Version:          iOS 9.3.1 (13E238)    // iOS系統的版本
Report Version:      105

如果產品上線之後, 回收集大量的Crash Log記錄檔, 可以對Crash檔案裡面的手機型號,版本號碼, 手機型號, iOS系統版本,進行分類, 可以獲得更多的資訊, 更好的解決bug甚至未知的bug具體原因, 做更好的測試

2.異常資訊

Exception Type:  EXC_CRASH (SIGABRT)   // 異常的類型
Exception Codes: 0x0000000000000000, 0x0000000000000000  // 異常出錯的代碼
Exception Note:  EXC_CORPSE_NOTIFY  // 異常通知
Triggered by Thread:  0 // 異常發生的線程(0代表主線程, 其他為主線程)

補充常見的Exception Codes代碼類型

Exception Codes:   常見代碼有以下幾種
                             0x8badf00d錯誤碼:Watchdog逾時,意為“ate bad food”。
                             0xdeadfa11錯誤碼:使用者強制退出,意為“dead fall”。
                             0xbaaaaaad錯誤碼:使用者按住Home鍵和音量鍵,擷取當前記憶體狀態,不代表崩潰。
                             0xbad22222錯誤碼:VoIP應用(因為太頻繁?)被iOS幹掉。
                             0xc00010ff錯誤碼:因為太燙了被幹掉,意為“cool off”。
                             0xdead10cc錯誤碼:因為在後台時仍然佔據系統資源(比如通訊錄)被幹掉,意為“dead lock”

補充常見的Exception Type異常類型的資訊:

1.EXC_BAD_ACCESS:此類型是最常見的crash, 通常用於訪問了不該訪問的記憶體導致的,一般     EXC_BAD_ACCESS後面的()還會帶有補充資訊

SIGSEGV:通常由於重複釋放對象導致, 一般在ARC以後很少見到

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

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

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

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

SIGFPE: 數學計算相關問題, 比如除零操作

SIGIPIPE: 管道另一端沒有進程接手資料

2. EXC_BAD_INSTRUCTION:此類異常通常由於線程執行非法指令導致
3. EXC_ARITHMETIC:除零錯誤會拋出此類異常
                                                   

Last Exception Backtrace: 最後異常回溯, 一般根據這個代碼就能找到具體的crash問題

下面截取的是的crash blog

Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0:
0   libsystem_kernel.dylib            0x000000018223ff24 __psynch_cvwait + 8
1   libsystem_pthread.dylib           0x000000018230ad20 _pthread_cond_wait + 704
2   Foundation                        0x0000000182f9fdf0 -[NSCondition waitUntilDate:] + 344
3   Foundation                        0x0000000182f9ce34 -[NSConditionLock lockWhenCondition:beforeDate:] + 256
4   UIKit                             0x000000018781dbc4 -[UIKeyboardTaskQueue waitUntilAllTasksAreFinished] + 196
5   UIKit                             0x0000000187c05878 -[UIKeyboardImpl setKeyboardInputMode:userInitiated:] + 112
6   UIKit                             0x0000000187c0de44 -[UIKeyboardImpl recomputeActiveInputModesWithExtensions:] + 336
7   UIKit                             0x000000018781e8f0 -[UIKeyboardImpl setDelegate:force:] + 2292
8   UIKit                             0x0000000187817eb0 -[UIPeripheralHost(UIKitInternal) _reloadInputViewsForResponder:] + 1180
9   UIKit                             0x00000001878179e4 -[UIResponder(UIResponderInputViewAdditions) reloadInputViews] + 80
10  UIKit                             0x0000000187879670 -[UIResponder becomeFirstResponder] + 600
11  UIKit                             0x0000000187879a1c -[UIView(Hierarchy) becomeFirstResponder] + 148
12  UIKit                             0x0000000187900b34 -[UITextField becomeFirstResponder] + 64
13  UIKit                             0x00000001879b1fe4 -[UITextInteractionAssistant(UITextInteractionAssistant_Internal) setFirstResponderIfNecessary] + 256
14  UIKit                             0x00000001879b1498 -

我們可以看到發生Crash的線程的Crash調用棧, 從上到下分別代表調用順序, 最上面的一個表示拋出異常的位置, 一次往下可以看到API調用順序, 的資訊表明本次Crash出現在[NSCondition waitUntilDate:]這個方法中(後面加的數值 我猜應該是地址位移量O(∩_∩)O) 大概可以找到crash的具體原因(某個檔案中的某個方法), 這樣問題就浮出水面了, 方便產品上線後版本迭代, 修改BUG.


最後有一個大神的分析很詳細大神分析Crash Log 很詳細

iOS Crash Log 分析(三)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.