iOS应用崩溃(二)——符号化解析

一、获取崩溃信息

  • 1、使用友盟、百度等第三方崩溃统计工具;
  • 2、自己实现应用内崩溃收集,并上传服务器;
  • 3、Xcode-Devices内直接查看某个设备的崩溃信息;
  • 4、使用苹果提供的Crash崩溃收集服务;

二、收集崩溃信息

苹果给我们提供了异常处理的类,NSException类,这个类可以创建一个异常对象,也可以通过这个类获取一个异常对象;

这个类中我们最常用的还好死一个获取崩溃信息的C函数,我们可以通过这个函数在程序发生异常的时候收集这个异常。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    //将下面C函数的函数地址当做参数
    NSSetUncaughtExceptionHandler(&UncaughtExceptionHandler);
    return YES;
}
// 设置一个C函数,用来接收崩溃信息
void UncaughtExceptionHandler(NSException *exception){
    // 可以通过exception对象获取一些崩溃信息,我们就是通过这些崩溃信息来进行解析的,例如下面的symbols数组就是我们的崩溃堆栈。
    NSArray *symbols = [exception callStackSymbols];
    NSString *reason = [exception reason];
    NSString *name = [exception name];
}

我们也可以通过下面方法获取崩溃统计的函数指针

NSUncaughtExceptionHandler *handler = NSGetUncaughtExceptionHandler();

三、dSYM符号集

1、利用Xcode符号化

手机和mac连接后,打开Xcode选择window进入Devices(快捷方式是 Shift-CMD-2),选中View Device Logs可展示该设备崩溃信息,然后找到对应app日志文件,如图所示:
iOS应用崩溃(二)——符号化解析_第1张图片

这样就可以看到已经符号化完毕的日志

2、利用symbolicate crash脚本符号化

  • 符号集是我们对ipa文件打包之后,和.app文件同级的后缀名为.dSYM的文件,这个文件必须使用Xcode进行打包才有;
  • 每个.dSYM文件都有一个UUID,和.app文件中的UUID对应,代表着是一个应用。而.dSYM文件中每一条崩溃信息也有一个单独的UUID,用来和程序的UUID进行校对;
  • 我们如果不实用.dSYM文件获取刀的崩溃信息都是不准确的;
  • 符号集中存储这文件名、方法明、行号的信息,是和可执行文件的16进制函数地址对应的,通过分析崩溃的.Cresh文件可以准确只都爱具体的崩溃信息;

我们每次Archive一个包之后,都会随之生成一个dSYM文件。每次发布一个版本,我们呢都需要备份这个文件,以方便以后的调试。进行崩溃信息符号化的时候,必须使用当前应用打包的电脑所生成的dSYM文件,其他电脑生成的文件可能会导致分析不准确的问题。

当程序崩溃的时候,我们呢可以获得到崩溃的错误堆栈,但是这个错误堆栈都是0x开头的16进制地址,需要我们使用Xcode自带的symbolicatecrash工具来将.Crash和.dSYM文件进行符号化,就可以得到详细崩溃的信息;

四、崩溃分析

命令行解析Crash文件
通过MAC自带的命令行工具解析Crash文件需要具备三个文件

  • symbolicatecrash,Xcode自带的崩溃分析工具,使用这个工具可以更精确的定位崩溃所在的位置,将0x开头的地址替代为响应的代码和具体行数;
  • 打包时产生的dSYM文件;
  • 崩溃时产生的Crash文件;

1、symbolicatecrash可在如下路径中找到

  • ①、Xcode 6.0以前的位置:
    /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKit.framework/Versions/A/Resources​
  • ②、Xcode 6.0以后的位置:
    ​/Applications/Xcode.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Versions/A/Resources

2、.dSYM可在如下路径中找到

Window->Organizer->Archives->中,选中archive的版本右击,选择Show in Finder中可获取dSYM文件了。

3、.crash文件获取可查看iOS应用崩溃(二)

4、解析崩溃创建文件夹

解析崩溃信息的时候,可在桌面上建立一个Crash文件夹,然后将.Crash、.dSYM、symbolicatecrash放在这个文件夹中;

5、命令语句

切换到桌面的Crash目录下: cd ~/Desktop/Crash
执行命令

 ./symbolicatecrash ./*.crash ./*.app.dSYM > symbol.crash

这时候终端有可能会出现:

Error: "DEVELOPER_DIR" is not defined at ./symbolicatecrash line 60

输入命令:

export DEVELOPER_DIR="/Applications/XCode.app/Contents/Developer"

再执行

./symbolicatecrash ./*.crash ./*.app.dSYM > symbol.crash 这时候终端将会进行处理了

处理结果是生成一个新的文件symbol.crash。这个文件就能用于分析了。

五、通过Xcode查看设备崩溃信息

 Mac连接手机之后,选择window-> devices -> 选择自己的手机 -> view device logs接可以查看崩溃信息了;

六、苹果自带崩溃统计工具

在Window->Organizer->Crashes中可以看到 Crashes
苹果自带的崩溃统计工具并不推荐用,如果想要使用这个功能,需要用户在iPhone中进行设置

设置->隐私->诊断与用量->诊断与用量数据(iOS8一下在通用中设置)

选择自动发送,并与开发者共享即可

你可能感兴趣的:(ios,异常处理,崩溃定位)