Qt for Android(十八) —— QT for Android 开发中Native异常捕获与跟踪

390 阅读2分钟

这是我参与8月更文挑战的第18天,活动详情查看:8月更文挑战

背景

  QT for Android 的开发不同于纯Android开发,如果是Android端的崩溃我们都是能通过try catch捕获到的,在稳定性运行过程中也能写入文件方便后期排查。但是当发生native异常时android端是无法捕获到的,且有时候logcat也打印不完整,这对于不能稳定复现的问题来说排查问题就会碰到很大的障碍。

方案一

  幸运的是,在项目初期,我们就可以集成一些第三方工具帮助我们捕获到发生的native异常。所以本文我要提到两个工具,一是我们很早就提到的bugly——bugly.qq.com/,使用方式见链接:NDK撩妹三部曲(四)—NDK 开发如何优雅的定位 Native 异常,看这篇就够了,这篇文章写到了我们怎么集成bugly,并用它帮助我们分析native异常。
但是bugly有个缺陷,需要你的APP联网,假如你的运行环境是没有网络的,该怎么办呢?

方案二

幸运的是github有很多非常优秀的第三方库可以帮到我们。今天我们要介绍的便是爱奇艺的开源库 XCrash:https://github.com/iqiyi/xCrash。readme文档已经很详细的介绍的它的强大。在它的example文件夹也有使用方式,我这里展示下我的使用方式和一些函数含义的介绍:

 XCrash.init(this, new XCrash.InitParameters()
                .setAppVersion(BuildConfig.VERSION_NAME)
                .setJavaRethrow(true)//捕获java异常
                .setJavaLogCountMax(5)//java崩溃文件的最大个数
                .setNativeRethrow(true)//捕获native异常
                .setNativeLogCountMax(10)
                .setAnrRethrow(true)//捕获ANR异常
                .setAnrLogCountMax(3)
                .setLogDir(basePath + "/crash_log")//异常文件的存储路径,Xcrash会自动创建文件夹
                .setLogFileMaintainDelayMs(1000));

然后再看下假如发生崩溃它生成的文件样式:

请添加图片描述

打马赛克的地方时包名,上面setAppVersion设置的版本号也会被写到文件名中。

再看下文件的内容样式:

请添加图片描述

可以看到,XCrash已经帮你解析出了崩溃的代码行数。