对于友盟提供的如下崩溃报告,很难看出是什么地方出了问题,接下来我们一步步通过dsym文件解析崩溃原因;
下面的崩溃报告中的app名称我用appname代替
Application received signal SIGSEGV
(null)
((
0 CoreFoundation 0x000000018236d1d0 + 148
1 libobjc.A.dylib 0x0000000180da455c objc_exception_throw + 56
2 CoreFoundation 0x000000018236d100 + 0
3 appname 0x10017b0e4 SmartFeedFish + 1552612
4 libsystem_platform.dylib 0x00000001813fd338 _sigtramp + 36
**5 appname 0x100022f90 SmartFeedFish + 143248
6 appname 0x100022f90 SmartFeedFish + 143248**
7 UIKit 0x000000018823a834 + 848
8 UIKit 0x000000018823ad98 + 220
9 UIKit 0x00000001882f3130 + 1236
10 UIKit 0x00000001883c40a0 + 232
11 UIKit 0x0000000188349be8 + 116
12 UIKit 0x000000018849a158 + 712
13 UIKit 0x000000018825b5b8 + 492
14 UIKit 0x000000018825b0dc + 312
15 UIKit 0x000000018825aef8 + 160
16 QuartzCore 0x00000001856c97e8 + 260
17 libdispatch.dylib 0x00000001811f61bc + 16
18 libdispatch.dylib 0x00000001811fad68 _dispatch_main_queue_callback_4CF + 1000
19 CoreFoundation 0x000000018231a810 + 12
20 CoreFoundation 0x00000001823183fc + 1660
21 CoreFoundation 0x00000001822462b8 CFRunLoopRunSpecific + 444
22 GraphicsServices 0x0000000183cfa198 GSEventRunModal + 180
23 UIKit 0x000000018828d7fc + 684
24 UIKit 0x0000000188288534 UIApplicationMain + 208
25 appname 0x100097db0 SmartFeedFish + 622000
26 libdyld.dylib 0x00000001812295b8 + 4
)
dSYM UUID: ***************1D-9804-96F6C382533D
CPU Type: arm64
Slide Address: 0x0000000100000000
Binary Image: appname
Base Address: 0x00000001000e8000
从这个崩溃报告中我们可以找多UUID,CPU Type类型,和Slide Address,这个三个数据很重要,下面我们分析:5 appname 0x100022f90 SmartFeedFish + 143248这个数据的崩溃原因,我们只要他的指针地址即可0x100022f90
下面我们还需要一个DSYM文件,这个文件在archives文件里面,你问archives在什么地方,就是你打包app时archives留下的文件,点击window-organizer-archives,里面就是我们经常打包app留下的archives文件,找到和你打包app对应的文件,也就是崩溃的app对应的archives文件,一定不要搞错了,不然找不出错误信息。
我的archive文件是这个,然后鼠标右键show in finder 我们可以看到这个文件存放的地方,
为了避免后面的操作出错,我们这个这个文件复制粘贴的桌面,这样后面操作非常方便,
然后右键显示包内容,我们可以看到几个文件夹,其中有一个dsyms的文件夹,打开这个文件夹你会看到后缀名是dsym的文件。
以上是我们要找的文件,现在正式操作找到崩溃原因,
快上车,没时间解释了,
现在打开终端,根据文件位置输入,先cd到dsyms文件夹,
cd /Users/mymac/Desktop/appname.xcarchive/dSYMs
然后再输入:
dwarfdump - -uuid appname.app.dSYM
这个appname.app.dSYM是dsyms文件夹下的,
然后我们就可以查到他的uuid,这个uuid要和崩溃日志里面的uuid一样才可以,
如果uuid这些都一样,下面就可以输入:
dwarfdump - -arch=arm64 - -lookup 0x100022f90 /Users/mymac/Desktop/appname.xcarchive/dSYMs/appname.app.dSYM/Contents/Resources/DWARF/appname
这句话意思:–arch=arm64手机的cpu类型。–lookup 0x100022f90 我们要解析的崩溃指针友盟里面有,
/Users/mymac/Desktop/appname.xcarchive/dSYMs/appname.app.dSYM/Contents/Resources/DWARF/appname 这个是dysm里面
选中右键显示包内容,打开里面的文件夹,直到最后一个文件。
这个文件
最后终端会给我错误信息
File: /Users/mymac/Desktop/appname.xcarchive/dSYMs/appname.app.dSYM/Contents/Resources/DWARF/appname (arm64)
Looking up address: 0x0000000100022f90 in .debug_info… found!
0x0005a5e4: Compile Unit: length = 0x00003421 version = 0x0002 abbr_offset = 0x00000000 addr_size = 0x08 (next CU at 0x0005da09)
0x0005a5ef: TAG_compile_unit [106] *
AT_producer( “Apple LLVM version 8.1.0 (clang-802.0.42)” )
AT_language( DW_LANG_ObjC )
AT_name( “/Users/mymac/Desktop/代码/新tutk/appname/appname/DeviceControllerViewController.m” )
AT_stmt_list( 0x00012c31 )
AT_comp_dir( “/Users/mymac/Desktop/代码/新tutk/appname” )
AT_APPLE_optimized( 0x01 )
AT_APPLE_major_runtime_vers( 0x02 )
AT_low_pc( 0x0000000100022438 )
AT_high_pc( 0x0000000100026fe0 )
0x0005b7c2: TAG_subprogram [111] *
AT_low_pc( 0x0000000100022ca4 )
AT_high_pc( 0x0000000100022fb0 )
AT_frame_base( reg29 )
AT_object_pointer( {0x0005b7e1} )
AT_name( “-[DeviceControllerViewController viewDidAppear:]” )
AT_decl_file( “/Users/mymac/Desktop/代码/新tutk/appname/appname/DeviceControllerViewController.m” )
AT_decl_line( 151 )
AT_prototyped( 0x01 )
AT_APPLE_optimized( 0x01 )
Line table dir : ‘/Users/appname/Desktop/代码/新tutk/appname/appname’
Line table file: ‘DeviceControllerViewController.m’ line 179, column 13 with start address 0x0000000100022f84
Looking up address: 0x0000000100022f90 in .debug_frame… not found.
可以看到DeviceControllerViewController.m这个文件出了问题,
在这个方法里崩溃了[DeviceControllerViewController viewDidAppear:]
在Line table file: ‘DeviceControllerViewController.m’ line 179, column 13
在179行这个代码
有什么不懂得下面留言
*到此结束**