1.为什么要符号化:
IOS程序在真机运行程序出现crash状况时,机器会自动产生log文件,它包含了在程序crash之前的运行逻辑,分析carsh文件,有效的解决程序在真机上的问题,保证程序良好的稳定性,但是这个crash文件多数是显示出现问题的地址和一些系统的消息,无法查看程序中对应的崩溃地点。所以需要符号化转化为我们熟悉的代码方便定位问题。
xxx.crash的原日志:
0 libsystem_kernel.dylib 0x32a50dfc __pthread_kill + 8
1 libsystem_pthread.dylib 0x32aced33 pthread_kill + 59
2 libsystem_c.dylib 0x329f0905 abort + 73
3 libsystem_c.dylib 0x329d0365 __assert_rtn + 89
4 -- 0x002d745d ‘‘‘0x4000‘‘‘ + 2962525
5 -- 0x0021b75b ‘‘‘0x4000‘‘‘ + 2193243
6 -- 0x0021af7d ‘‘‘0x4000‘‘‘ + 2191229
7 Foundation 0x25903d6b __NSThreadPerformPerform + 383
8 CoreFoundation 0x24bb9d55 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 13
9 CoreFoundation 0x24bb9163 __CFRunLoopDoSources0 + 215
10 CoreFoundation 0x24bb77c9 __CFRunLoopRun + 769
11 CoreFoundation 0x24b053bd CFRunLoopRunSpecific + 473
12 CoreFoundation 0x24b051cf CFRunLoopRunInMode + 103
13 GraphicsServices 0x2bebd0a5 GSEventRunModal + 133
14 UIKit 0x28114f9d UIApplicationMain + 1437
15 -- 0x00350615 0x4000 + 3458581
16 libdyld.dylib 0x3298aaad start + 1
符号化后:
0 libsystem_kernel.dylib 0x32a50dfc __pthread_kill + 8
1 libsystem_pthread.dylib 0x32aced33 pthread_kill + 59
2 libsystem_c.dylib 0x329f0905 abort + 73
3 libsystem_c.dylib 0x329d0365 __assert_rtn + 89
4 -- 0x002d745d -‘‘‘[Middleware fundOpenInfo:]‘‘‘ + 3637
5 -- 0x0021b75b -‘‘‘[FundInfoController setInfoData:]‘‘‘ + 135
6 -- 0x0021af7d -‘‘‘[FundInfoController onSkyReceive:]‘‘‘ + 421
7 Foundation 0x25903d6b __NSThreadPerformPerform + 383
8 CoreFoundation 0x24bb9d55 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 13
9 CoreFoundation 0x24bb9163 __CFRunLoopDoSources0 + 215
10 CoreFoundation 0x24bb77c9 __CFRunLoopRun + 769
11 CoreFoundation 0x24b053bd CFRunLoopRunSpecific + 473
12 CoreFoundation 0x24b051cf CFRunLoopRunInMode + 103
13 GraphicsServices 0x2bebd0a5 GSEventRunModal + 133
14 UIKit 0x28114f9d UIApplicationMain + 1437
15 -- 0x00350615 main (main.m:18)
16 libdyld.dylib 0x3298aaad start + 1
显然,符号化后能够精确的定位到代码级的崩溃语句。
2.符号化crash日志需要3样东西:
1).crash日志本身(如:example.crash)
1/可以从iTunes Connect(Manage Your Applications – View Details – Crash Reports)获取普通用户的crash日志
2/自己的手机可以连接到iTunes同步后,在电脑中查看crash文件。
2).crash日志所对应的.app包(如:example.app)
如果你有的是.ipa包,你可以解压后在Payload/文件夹下获得.app包
3).crash日志多对应的.dSYM包
.app必须和.dSYM对应(打包为xcarchive时,同时产生)。
将上面三个文件放在同一个文件目录下面:
3.symbolicatecrash是xcode自带的工具,为了方便调用,可以做一个快捷方式,方便在任意路径下调用
首先在termail下,输入:
find /Applications/Xcode.app -name symbolicatecrash -type f
用来查找symbolicatecrash的真实位置。
(这个位置会随着系统的更新,系统修改)
以我的机器为例,会返回如下路径:
/Applications/Xcode.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Versions/A/Resources/symbolicatecrash
下一步建立快捷方式:
sudo ln -s /Applications/Xcode.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Versions/A/Resources/symbolicatecrash /usr/local/bin/symbolicatecrash
4.使用symbolicatecrash
在termail下,进入包含xxx.crash xxx.app xxx.dSYM的文件夹目录
symbolicatecrash xxx.crash xxx.app > crash.log
如果遇到 "DEVELOPER_DIR" is not defined 的报错,执行以下命令:
export DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer
得到符号化后的文件。