程序员定位bug的方式千千万,这是其中一种。
测试在测试中,客户在使用中难免会遇到各种各样的bug崩溃,此时找到你,就需要能够定位bug位置,并解决bug。
首先我们需要准备两个个文件,appName.app. dSYM、.crash并将他们放在同一个文件夹下。
appName.app. dSYM
这个文件分两种情况:
1.Xcode直接打包安装到手机
可以如下图所示直接右击并点击Show in Finder,在同目录下寻找.dSYM文件。
如果没有.dSYM文件,很有可能是Debug下没有生成.dSYM。可以在Buid Setting中打开该选项。
2.利用.ipa安装(包括appStore、hoc证书分发)
可以在Xcode->Window-Organizer中找到当时打包的. xcarchive文件,然后右击Show In Finder,找到文件后右击显示包内容,然后在里面找到appName.app. dSYM文件。
.crash
可以直接连接手机,打开Xcode->Window->Devide and Simulators,然后选择对应的Device,并点击View Device Logs,根据时间点选择对应的crash文件。
开始符号化
1.将两个文件放入同一个文件夹中后,打开终端并cd到对应文件夹下
2.查看DSYM文件UUID
dwarfdump --uuid appName.app.dSYM
//输出结果:UUID: ECCA19DE-145B-3F22-BA41-6252F7570BFB (arm64) appName.app.dSYM/Contents/Resources/DWARF/appName
3.查看.crash UUID,利用Sublime Text等工具直接打开.crash文件,滚动到Binary Images:位置后,<ecca19de145b3f22ba416252f7570bfb>这个就是.crash的UUID,两个UUID必须完全一致,否则将无法正确符号化。
0x1004f0000 - 0x101943fff appName arm64 <ecca19de145b3f22ba416252f7570bfb> /var/containers/Bundle/Application/7465D6C7-DBD9-458B-9B25-3BE599C09AF8/appName.app/appName
3.分析.crash文件
Thread 0 name: Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0 libswiftCore.dylib 0x00000001cb264b00 specialized _fatalErrorMessage+ 2112256 (_:_:file:line:flags:) + 296
1 libswiftCore.dylib 0x00000001cb264b00 specialized _fatalErrorMessage+ 2112256 (_:_:file:line:flags:) + 296
2 libswiftCore.dylib 0x00000001cb070524 _ArrayBuffer._checkInoutAndNativeTypeCheckedBounds+ 62756 (_:wasNativeTypeChecked:) + 232
3 libswiftCore.dylib 0x00000001cb073510 Array.subscript.getter + 84
4 appName 0x00000001005feba0 0x1004f0000 + 1108896
5 appName 0x00000001005fcc88 0x1004f0000 + 1100936
6 appName 0x00000001005fce84 0x1004f0000 + 1101444
7 UIKitCore 0x00000001c9f180f0 -[UIApplication
可以看到是Thread 0 Crashed
3.执行如下命令,然后在换行处输入:0x00000001005feba0(这个根据上面分析.crash文件获得的具体地址)
arm64是架构 ,appName是app文件,0x1004f0000是基地址
xcrun atos -o appName.app.dSYM/Contents/Resources/DWARF/appName -l 0x1004f0000 -arch arm64
终端输出:
AppDelegate.updateRootViewController() (in ) (AppDelegate.swift:104)
此时此刻,定位到了bug具体的位置,如果没定位成功可以继续选择其他的地址试试看。。。。