• iOS,应用崩溃日志分析


    参考资料:http://www.cocoachina.com/industry/20130725/6677.html

    1.获得崩溃日志

    2.崩溃日志实例

    3.符号化崩溃日志

    4.低内存闪退

    5.代码获取崩溃日志

    获得崩溃日志

      1.1Xcode上选择Windows/Devices;选中设备,点击Views Device Logs可以看到设备Crash日志

        1.2应用提交到App Store后,你也能从 iTunes Connect 获取到用户的崩溃日志. 登录到 iTunes Connect 上, 选择 Manage Your Applications, 点击相应的应用, 点击应用图标下面的 View Details 按钮, 然后点击右栏Links部分的  Crash Reports 。

     

    崩溃日志实例

    2.1进程信息

    Incident Identifier是崩溃报告的唯一标识符。

    CrashReporter Key是与设备标识相对应的唯一键值。虽然它不是真正的设备标识符,但也是一个非常有用的情报:如果你看到100个崩溃日志的CrashReporter Key值都是相同的,或者只有少数几个不同的CrashReport值,说明这不是一个普遍的问题,只发生在一个或少数几个设备上。

    Hardware Model是标识设备类型。 如果很多崩溃日志都是来自相同的设备类型,说明应用只在某特定类型的设备上有问题。上面的日志里,崩溃日志产生的设备是iPhone 4s。 

    Process是应用名称。中括号里面的数字是闪退时应用的进程ID。

    2.2基本信息

      这部分给出了一些基本信息,包括闪退发生的日期和时间,设备的iOS版本。如果有很多崩溃日志都来自iOS 6.0,说明问题只发生在iOS 6.0上。

    2.3异常

      在这部分,你可以看到闪退发生时抛出的异常类型。还能看到异常编码和抛出异常的线程。根据崩溃报告类型的不同,在这部分你还能看到一些另外的信息。

    2.4线程回溯

      这部分提供应用中所有线程的回溯日志。 回溯是闪退发生时所有活动帧清单。它包含闪退发生时调用函数的清单。

    看下面这行日志:

    它包括四列:
    帧编号—— 此处是2。
    二进制库的名称 ——此处是 XYZLib.
    调用方法的地址 ——此处是 0x34648e88.
    第四列分为两个子列,一个基本地址和一个偏移量。此处是0×83000 + 8740, 第一个数字指向文件,第二个数字指向文件中的代码行。
     
    2.5线程状态
      这部分是闪退时寄存器中的值。一般不需要这部分的信息,因为回溯部分的信息已经足够让你找出问题所在。
     
    2.6二进制映像
      这部分列出了闪退时已经加载的二进制文件。
    2.7异常编码
      0x8badf00d: 读做 “ate bad food”! (把数字换成字母,是不是很像 :p)该编码表示应用是因为发生watchdog超时而被iOS终止的。  通常是应用花费太多时间而无法启动、终止或响应用系统事件。
      0xbad22222: 该编码表示 VoIP 应用因为过于频繁重启而被终止。
      0xdead10cc: 读做 “dead lock”!该代码表明应用因为在后台运行时占用系统资源,如通讯录数据库不释放而被终止 。
      0xdeadfa11: 读做 “dead fall”! 该代码表示应用是被用户强制退出的。根据苹果文档, 强制退出发生在用户长按开关按钮直到出现 “滑动来关机”, 然后长按 Home按钮。强制退出将产生 包含0xdeadfa11 异常编码的崩溃日志, 因为大多数是强制退出是因为应用阻塞了界面。
     (注意: 在后台任务列表中关闭已挂起的应用不会产生崩溃日志。 一旦应用被挂起,它何时被终止都是合理的。所以不会产生崩溃日志。)

    符号化崩溃日志

    3.1使用Xcode查看

      打开Xcode菜单上的Window——Devices,找到设备的device logs项中的crash log,稍等片刻,你就会发现这里的crash log已经被自动解析过了(大部分情况会自动解析,如果不行请右键点击选择Re-Sysbomlicate)。

    3.2命令行工具symbolicatecrash

      准备下面3个文件

      crash报告(.crash文件)

      dSYM 符号集(.dSYM文件):Xcode编译项目后,我们会看到一个同名的 dSYM 文件,dSYM 是保存 16 进制函数地址映射信息的中转文件,我们调试的 symbols 都会包含在这个文件中,并且每次编译项目的时候都会生成一个新的 dSYM 文件,位于 /Users/<用户名>/Library/Developer/Xcode/Archives 目录下,在Finder按Shift+command+G;找到对应xcarchive文件,右键显示包内容拿出dSYM文件

      symbolicatecrash(日志符号化工具):在终端中执行 find /Applications/Xcode.app -name symbolicatecrash -type f

    根据执行结果请打开Finder-----> 应用程序 -------> Xcode -------> 右键 显示包内容,在 下面 这个路径下面就可以看到symbolicatecrash工具了

        Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash

    之后把3个文件拷贝到一个文件夹中

      打开终端先执行export DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer;然后执行

    /Users/Vie/Desktop/CarshLog/symbolicatecrash /Users/Vie/Desktop/CarshLog/Crasher.crash /Users/Vie/Desktop/CarshLog/Crasher.app.dSYM >/Users/Vie/Desktop/CarshLog/Crasher.log;(/Users/Vie/Desktop/CarshLog/为文件路径,可以将文件直接拖到终端)得到符号化后的日志文件

    获得的日志可以看到崩溃信息

    低内存闪退

      低内存崩溃日志与普通崩溃略有不同;被iOS因释放内存页终止的进程名称后面你会看到jettisoned 字样。如果看到它出现在你的应用名称后面,说明你的应用因使用太多内存而被终止了。

    代码获取崩溃日志

    //程序启动中添加异常捕获监听函数,用来获取异常信息AppDelegate

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        // Override point for customization after application launch.
       //UncaughtExceptionHandler是一个函数指针,该函数需要我们实现,可以取自己想要的名字。当程序发生异常崩溃时,该函数会得到调用,这跟C,C++中的回调函数的概念是一样的。(系统能捕获到的才会返回)
        NSSetUncaughtExceptionHandler(&UncaughtExceptionHandler);
        return YES;
    }
    void UncaughtExceptionHandler(NSException *exception) {
        NSArray *arrStack = [exception callStackSymbols];//得到当前调用栈信息
        NSString *reason = [exception reason];//非常重要,就是崩溃的原因
        NSString *name = [exception name];//异常类型
        NSLog(@"exception type : %@ 
     crash reason : %@ 
     call stack info : %@", name, reason, arrStack);
    }

    //使用

        NSArray *array=@[@"1111",@"22222"];
        [array objectAtIndex:3];

    //结果

    2017-02-14 18:26:00.045 RuntimeTest[8189:1539567] 
    *************统计打点进入页面:ViewController
    2017-02-14 18:26:14.193 RuntimeTest[8189:1539567] exception type : NSRangeException 
     crash reason : *** -[__NSArrayI objectAtIndex:]: index 3 beyond bounds [0 .. 1] 
     call stack info : (
        0   CoreFoundation                      0x0000000185cd82f4 <redacted> + 160
        1   libobjc.A.dylib                     0x00000001974ac0e4 objc_exception_throw + 60
        2   CoreFoundation                      0x0000000185bbbb34 CFRunLoopRemoveTimer + 0
        3   RuntimeTest                         0x0000000100096e44 -[ViewController viewDidLoad] + 1152
        4   UIKit                               0x000000018a718c84 <redacted> + 692
        5   UIKit                               0x000000018a718994 <redacted> + 32
        6   UIKit                               0x000000018a71f1d0 <redacted> + 72
        7   UIKit                               0x000000018a71c880 <redacted> + 260
        8   UIKit                               0x000000018a78e8ec <redacted> + 56
        9   UIKit                               0x000000018a9a2a94 <redacted> + 2952
        10  UIKit                               0x000000018a9a5208 <redacted> + 1504
        11  UIKit                               0x000000018a9a3778 <redacted> + 184
        12  FrontBoardServices                  0x000000018e4e93c8 <redacted> + 32
        13  CoreFoundation                      0x0000000185c9027c <redacted> + 20
        14  CoreFoundation                      0x0000000185c8f384 <redacted> + 312
        15  CoreFoundation                      0x0000000185c8d9a8 <redacted> + 1756
        16  CoreFoundation                      0x0000000185bb92d4 CFRunLoopRunSpecific + 396
        17  UIKit                               0x000000018a78443c <redacted> + 552
        18  UIKit                               0x000000018a77efac UIApplicationMain + 1488
        19  RuntimeTest                         0x0000000100098170 main + 124
        20  libdyld.dylib                       0x0000000197b2aa08 <redacted> + 4
    )
    2017-02-14 18:26:14.194 RuntimeTest[8189:1539567] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayI objectAtIndex:]: index 3 beyond bounds [0 .. 1]'
    *** First throw call stack:
    (0x185cd82d8 0x1974ac0e4 0x185bbbb34 0x100096e44 0x18a718c84 0x18a718994 0x18a71f1d0 0x18a71c880 0x18a78e8ec 0x18a9a2a94 0x18a9a5208 0x18a9a3778 0x18e4e93c8 0x185c9027c 0x185c8f384 0x185c8d9a8 0x185bb92d4 0x18a78443c 0x18a77efac 0x100098170 0x197b2aa08)
    libc++abi.dylib: terminating with uncaught exception of type NSException
    (lldb) 
  • 相关阅读:
    CUDA运行时 Runtime(一)
    CUDA C++程序设计模型
    CUDA C++编程手册(总论)
    深度学习到底有哪些卷积?
    卷积神经网络去雾去雨方法
    马斯克如何颠覆航天? 1/5385成本,c++和python编程!
    CUDA 9中张量核(Tensor Cores)编程
    利用表达式调用全局变量计算出错原因
    述函数的作用,浏览器执行函数的过程
    表达式的差异和相同点
  • 原文地址:https://www.cnblogs.com/douniwanxia/p/6206567.html
Copyright © 2020-2023  润新知