1. 程式人生 > >iOS分析崩潰日誌

iOS分析崩潰日誌

前言

  iOS分析定位崩潰問題有很多種方式,但是釋出到AppStore的應用如果崩潰了,我們該怎麼辦呢?通常我們都會在系統中接入統計系統,在系統崩潰的時候記錄下崩潰日誌,下次啟動時將日誌傳送到服務端,比較好的第三方有umeng之類的。今天我們來講一下通過崩潰日誌來分析定位我們的bug。

dYSM檔案

  分析崩潰日誌的前提是我們需要有dYSM檔案,這個檔案是我們用archive打包時生成的.xcarchive字尾的檔案包。一個良好的習慣是,在你打包提交稽核的時候,將生成的.xcarchive與ipa檔案一同拷貝一份,按照版本號儲存下來,這樣如果線上出現問題可以快速的找到你想要的檔案來定位你的問題。

崩潰日誌

一般崩潰日誌都會像下面這樣:

NSConcreteMutableAttributedString addAttribute:value:range:: nil value
(null)
((
    CoreFoundation                      0x0000000185c642f4 <redacted> + 160
    libobjc.A.dylib                     0x00000001974880e4 objc_exception_throw + 60
    CoreFoundation                      0x0000000185c64218 <redacted
>
+ 0 Foundation 0x0000000186a9dfb4 <redacted> + 152 Xmen 0x10073fb30 Xmen + 7600944 Xmen 0x1006bbbf4 Xmen + 7060468 UIKit 0x000000018a9a47fc <redacted> + 60 UIKit 0x000000018a9a512c <redacted
>
+ 104 UIKit 0x000000018a6b2b6c <redacted> + 88 UIKit 0x000000018a9a4fd4 <redacted> + 444 UIKit 0x000000018a78e274 <redacted> + 1012 UIKit 0x000000018a999aac <redacted> + 2904 UIKit 0x000000018a785268 <redacted> + 172 UIKit 0x000000018a6a1760 <redacted> + 580 QuartzCore 0x0000000189fe9e1c <redacted> + 152 QuartzCore 0x0000000189fe4884 <redacted> + 320 QuartzCore 0x0000000189fe4728 <redacted> + 32 QuartzCore 0x0000000189fe3ebc <redacted> + 276 QuartzCore 0x0000000189fe3c3c <redacted> + 528 QuartzCore 0x0000000189fdd364 <redacted> + 80 CoreFoundation 0x0000000185c1c2a4 <redacted> + 32 CoreFoundation 0x0000000185c19230 <redacted> + 360 CoreFoundation 0x0000000185c19610 <redacted> + 836 CoreFoundation 0x0000000185b452d4 CFRunLoopRunSpecific + 396 GraphicsServices 0x000000018f35b6fc GSEventRunModal + 168 UIKit 0x000000018a70afac UIApplicationMain + 1488 Xmen 0x1008cf9c0 Xmen + 9238976 libdyld.dylib 0x0000000197b06a08 <redacted> + 4 ) dSYM UUID: 30833A40-0F40-3980-B76B-D6E86E4DBA85 CPU Type: arm64 Slide Address: 0x0000000100000000 Binary Image: Xmen Base Address: 0x000000010007c000

是不是看的一臉懵逼,下面我來教大家如何結合crash log 與 dYSM檔案 來分析定位出程式碼崩潰在哪一個檔案的哪一行程式碼

提取崩潰日誌中有用的資訊

  • NSConcreteMutableAttributedString addAttribute:value:range:: nil value 崩潰的原因是value為nil
  • ” 4 Xmen 0x10073fb30 Xmen + 7600944” 它指出了應用名稱,崩潰時的呼叫方法的地址,檔案的地址以及方法所在的行的位置,我們需要的是這一個:”0x10073fb30”。
  • “dSYM UUID: 30833A40-0F40-3980-B76B-D6E86E4DBA85”。
  • “CPU Type: arm64”。

開始分析

  • 開啟終端進入到你的dYSM檔案的目錄下面:
    cd /Dandy/XMEN/上線版本/2.0.17_105/aaaa.xcarchive/dSYMs
  • 驗證下崩潰日誌中的UUID與本地的dYSM檔案是否是相匹配的:
    “Xmen”為你的app名稱
    dwarfdump --uuid Xmen.app.dSYM
    結果是:
UUID: BFF6AE00-8B5F-39BD-AFD0-27707C489B25 (armv7) Xmen.app.dSYM/Contents/Resources/DWARF/Xmen
UUID: 30833A40-0F40-3980-B76B-D6E86E4DBA85 (arm64) Xmen.app.dSYM/Contents/Resources/DWARF/Xmen

發現與我們日誌中的:UUID和CPU Type是相匹配的

  • 查詢錯誤
    dwarfdump --arch=arm64 --lookup 0x10073fb30 /Dandy/XMEN/上線版本/2.0.17_105/aaaa.xcarchive/dSYMs/Xmen.app.dSYM/Contents/Resources/DWARF/Xmen
    “arm64”與”0x1008cf9c0”分別對應於上面我們從日誌中提取出來的有用資訊
    “/Dandy/XMEN/上線版本/2.0.17_105/aaaa.xcarchive/dSYMs/Xmen.app.dSYM/Contents/Resources/DWARF/Xmen”對應於你本地dYSM檔案目錄
    “Xmen”對應於你的app名稱
    結果像下面這樣:
File: /Dandy/XMEN/上線版本/2.0.17_105/aaaa.xcarchive/dSYMs/Xmen.app.dSYM/Contents/Resources/DWARF/Xmen (arm64)
Looking up address: 0x000000010073fb30 in .debug_info... found!
0x00219b05: Compile Unit: length = 0x00003dd0  version = 0x0002  abbr_offset = 0x00000000  addr_size = 0x08  (next CU at 0x0021d8d9)
0x00219b10: TAG_compile_unit [107] *
AT_producer( "Apple LLVM version 8.0.0 (clang-800.0.42.1)" )
AT_language( DW_LANG_ObjC )
AT_name( "/Dandy/checkSvn/IOS/xmen/Xmen/Modules/StoreManage/SellerOrder/View/DSSellerOrderSectionHeaderView.m" )
AT_stmt_list( 0x001272a9 )
AT_comp_dir( "/Dandy/checkSvn/IOS/xmen" )
AT_APPLE_major_runtime_vers( 0x02 )
AT_low_pc( 0x000000010072b8ac )
AT_high_pc( 0x000000010074e350 )
0x0021aec5:    TAG_subprogram [119] *
AT_low_pc( 0x0000000100739810 )
AT_high_pc( 0x000000010074006c )
AT_frame_base( reg29 )
AT_object_pointer( {0x0021aee3} )
AT_name( "-[DSSellerOrderSectionHeaderView updateContentWithOrderData:isEdit:]" )
AT_decl_file( "/Dandy/checkSvn/IOS/xmen/Xmen/Modules/StoreManage/SellerOrder/View/DSSellerOrderSectionHeaderView.m" )
AT_decl_line( 248 )
AT_prototyped( 0x01 )
0x0021af36:        TAG_lexical_block [138] *
AT_ranges( 0x00008640
[0x000000010073cf90 - 0x000000010073fb88)
[0x000000010073fbc0 - 0x000000010073fbc4)
End )
Line table dir : '/Dandy/checkSvn/IOS/xmen/Xmen/Modules/StoreManage/SellerOrder/View'
Line table file: 'DSSellerOrderSectionHeaderView.m' line 680, column 9 with start address 0x000000010073faf8
Looking up address: 0x000000010073fb30 in .debug_frame... not found.

我們來從終端結果來分析出我們想要的結果:
這一行告訴我們崩潰的程式碼所在的檔案的目錄

Line table dir : '/Dandy/checkSvn/IOS/xmen/Xmen/Modules/StoreManage/SellerOrder/View'

這一行告訴我們崩潰程式碼所在的具體檔案

AT_decl_file( "/Dandy/checkSvn/IOS/xmen/Xmen/Modules/StoreManage/SellerOrder/View/DSSellerOrderSectionHeaderView.m" )

這一行告訴我們崩潰程式碼是在哪一個方法裡面

AT_name( "-[DSSellerOrderSectionHeaderView updateContentWithOrderData:isEdit:]" )

這一行告訴我們崩潰程式碼具體在哪一行了

Line table file: 'DSSellerOrderSectionHeaderView.m' line 680, column 9 with start address 0x000000010073faf8

好的,現在我們分析到了崩潰程式碼在哪一行了,下面我們來找一找bug

查詢bug

  我們的程式碼都應該有託管平臺,每個版本上線都需要打一個tag,這是一個好習慣。下面我拉下我崩潰的對應版本的tag,找到崩潰程式碼那一行:

  結合崩潰日誌中告訴我:崩潰的原因是value為nil,發現是因為receiverTelephone欄位中有中文導致轉url時為nil導致的,下面的解bug就看各自本領啦。

結語

  希望對您有幫助,謝謝支援~

相關推薦

iOS分析崩潰日誌

前言   iOS分析定位崩潰問題有很多種方式,但是釋出到AppStore的應用如果崩潰了,我們該怎麼辦呢?通常我們都會在系統中接入統計系統,在系統崩潰的時候記錄下崩潰日誌,下次啟動時將日誌傳送到服務端,比較好的第三方有umeng之類的。今天我們來講一下通過崩潰

iOS 獲取崩潰日誌

新建一個類CatchCrash @interface CatchCrash : NSObject void uncaughtExceptionHandler(NSException *exception); @end @implementation CatchCrash void un

iOS應用崩潰日誌揭祕

作為一名應用開發者,你是否有過如下經歷? 為確保你的應用正確無誤,在將其提交到應用商店之前,你必定進行了大量的測試工作。它在你的裝置上也執行得很好,但是,上了應用商店後,還是有使用者抱怨會閃退 ! 如果你跟我一樣是個完美主義者,你肯定想將應用做到盡善盡美。於是你

iOS APP 崩潰日誌收集

推薦Bugly(只用過這個第三方的) 使用時也很簡單,在Bugly中心新建產品,它會生成一個appid給你,你需要做的最後一步就是在appdelegate裡新增如下程式碼 - (BOOL)application:(UIApplication *)applicatio

iOS應用崩潰日誌

3、Exception(非常重要) Exception Type:  EXC_CRASH (SIGABRT) Exception Codes: 0x0000000000000000, 0x0000000000000000 Exception Note:  EXC_CORPSE_NOTIFY Trigge

iOS獲取崩潰日誌

可讀的 name evel .html epo 了解 說明 hone 應用程序 重要提示: 此文檔不再更新。有關Apple SDK的最新信息,請訪問文檔網站。 來源: https://developer.apple.com/library/archive/qa/qa1

iOS 崩潰日誌分析(個人總結,最實用)

要分析奔潰日誌需要三個檔案:crash日誌,symbolicatecrash分析工具,.dSYM符號集 0. 在桌面建立一個crash資料夾 1. 需要Xcode自帶的崩潰分析工具symbolicatecrash,這個檔案的位置參考:/Applications/Xcode.

iOS 崩潰日誌收集及分析

最近幾天,專案中在增加推送功能,選用的極光推送SDK,相信大家也都用過,官方文件的整合步驟很詳細,整合也很容易。但是這跟今天的主題有什麼關係呢??? 黑人問號???別急,下面就來說說我今天的遭遇。坑~~~ 話說,由於iOS10之後,蘋果對推送進行了重大更新,主要是新增了 U

Xcode7.3下如何分析線上(已通過AppStore稽核)IOS應用的崩潰日誌

xcode9.4在Organizar已經可以直接看到符號化後的崩潰日誌。(20180814) 這得從提交稽核說起,把程式碼打包成.ipa需要執行Xcode的Archive操作. Archive完成後會開啟Xcode的Organizar頁面。 記住這

iOS 符號化崩潰日誌

term 崩潰 neo 文件 ica evel xcode 符號 ati 1、獲取一下三個文件 1. crash報告(.crash文件) 2. 符號文件 (.dsymb文件) 3. 應用程序文件 (appName.app文件,把IPA文件後綴改為zip,然後解壓,Pay

iOS崩潰日誌 如何看

ffd 通過 1.0 san version sig cps fff pre 轉載至搜狗測試 日誌主要分為六個部分:進程信息、基本信息、異常信息、線程回溯、線程狀態和二進制映像。 我們在進行iPhone應用測試時必然會在“隱私”中找到不少應用的崩潰日誌,但是不會閱讀對於

iOS開發之崩潰日誌符號化及程式碼定位

提交應用到App Store時如果稽核被拒,可能會發送給我們一個崩潰日誌,如果提示資訊不足以讓我們知道崩潰在哪裡,那就使用以下這種通過定位日誌從而知道崩潰vc與行數。 // 回到你的打包介面 // 找到.dsYM檔案 這時回到iTunes con

iOS--上線被拒如何從蘋果返回的崩潰日誌iOS.crash檔案處理找崩點(看這篇就懂了)

2017年底了,現在蘋果上線的越來越嚴,導致被拒的次數也是越來越特多。我們從蘋果給的提示可以看出我們大概崩潰的位置,但是作為程式設計師的我們,找到具體崩潰的點才能更好的修復。 AppStore稽核沒有通過,給了3個crashLog.txt檔案,可是開啟後都是十六進位制的東東(根本不知道

iOS 之獲取崩潰日誌

為了更好的維護iosAPP,處理程式崩潰是必需要做的,那麼如何收集使用者使用時出現的崩潰呢,基本的方法如下:1.上傳appStore的app,可以通過iTunes Stroe獲取2.利用Xcode獲取。3. Crashlytics,Hockeyapp ,友盟,Bugly 等等

iOS通過dSYM檔案分析crash日誌

iOS通過dSYM檔案分析crash日誌 平常在開發的過程中,遇到到了Crash可以很容易的通過Xcode去定位Crash的位置,但是當我們的App釋出以後,遇到閃退就不可以通過Xcode去除錯了。當然現在也有很多產品可以線上分析,例如騰訊的bugly與友盟的錯誤分析。這些分析工具的最基本的地方還是

iOS 崩潰日誌 Backtrace的符號化

iOS的崩潰日誌配合dsym檔案可以找到崩潰時的backtrace,這是解決崩潰的最重要的資訊. 如果是在同一臺mac上打包, 匯入crash log時候會自動將backtrace符號化,可以看到方法名, 檔名和行號 但是,有時候發版的包不是在你的mac上打包的,xcode

獲取IOS應用異常崩潰日誌資訊

應用異常崩潰是很正常的事情,但是應用異常崩潰資訊對開發者非常重要。下面就介紹如何在iOS應用中捕獲異常崩潰資訊: 1. 程式啟動中新增異常捕獲監聽函式,用來獲取異常資訊   NSSetUncaughtExceptionHandler (&UncaughtExcep

iOS讀懂崩潰日誌,解析崩潰日誌

被蘋慘劇,沒有截圖,就給你幾個崩潰日誌,整的是不是整個人都快崩潰了!!!!!別急。 一.既然蘋果給我們反饋崩潰日誌就有辦法能夠找出崩潰的地方。開啟看一般看不懂的,下面我們就來解析一下這個崩潰日誌 1.在桌面上建立一個 crash 空資料夾。 2.下

iOS 中捕獲程式崩潰日誌

iOS開發中遇到程式崩潰是很正常的事情,如何在程式崩潰時捕獲到異常資訊並通知開發者,是大多數軟體都選擇的方法。下面就介紹如何在iOS中實現:1. 在程式啟動時加上一個異常捕獲監聽,用來處理程式崩潰時的回撥動作 NSSetUncaughtExceptionHandler (&UncaughtExcep

友盟抓取crash Log- 解析IOS崩潰日誌

http://blog.csdn.net/xyxjn/article/details/43310061 http://blog.csdn.net/smking/article/details/9342899 最近在解析ume