你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發基礎 >> iOS分析崩潰日志

iOS分析崩潰日志

編輯:IOS開發基礎

前言

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

dYSM文件

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

2030896-908e107a5818a2e9.png

崩潰日志

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

NSConcreteMutableAttributedString addAttribute:value:range:: nil value
(null)
((
    CoreFoundation                      0x0000000185c642f4  + 160
    libobjc.A.dylib                     0x00000001974880e4 objc_exception_throw + 60
    CoreFoundation                      0x0000000185c64218  + 0
    Foundation                          0x0000000186a9dfb4  + 152
    Xmen                                0x10073fb30 Xmen + 7600944
    Xmen                                0x1006bbbf4 Xmen + 7060468
    UIKit                               0x000000018a9a47fc  + 60
    UIKit                               0x000000018a9a512c  + 104
    UIKit                               0x000000018a6b2b6c  + 88
    UIKit                               0x000000018a9a4fd4  + 444
    UIKit                               0x000000018a78e274  + 1012
    UIKit                               0x000000018a999aac  + 2904
    UIKit                               0x000000018a785268  + 172
    UIKit                               0x000000018a6a1760  + 580
    QuartzCore                          0x0000000189fe9e1c  + 152
    QuartzCore                          0x0000000189fe4884  + 320
    QuartzCore                          0x0000000189fe4728  + 32
    QuartzCore                          0x0000000189fe3ebc  + 276
    QuartzCore                          0x0000000189fe3c3c  + 528
    QuartzCore                          0x0000000189fdd364  + 80
    CoreFoundation                      0x0000000185c1c2a4  + 32
    CoreFoundation                      0x0000000185c19230  + 360
    CoreFoundation                      0x0000000185c19610  + 836
    CoreFoundation                      0x0000000185b452d4 CFRunLoopRunSpecific + 396
    GraphicsServices                    0x000000018f35b6fc GSEventRunModal + 168
    UIKit                               0x000000018a70afac UIApplicationMain + 1488
    Xmen                                0x1008cf9c0 Xmen + 9238976
    libdyld.dylib                       0x0000000197b06a08  + 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,找到崩潰代碼那一行:

2030896-46b84b37cf488cf1.png

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

結語

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

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved