当前位置:网站首页>捕获 flutter app的崩溃日志并上报
捕获 flutter app的崩溃日志并上报
2021-01-16 09:33:52 【osc_p23q7y3z】
flutter 的崩溃日志收集主要有两个方面:
- flutter dart 代码的异常(包含app和framework代码两种情况,一般不会引起闪退,你猜为什么)
- flutter engine 的崩溃日志(一般会闪退)
Flutter App 代码异常捕获
人写的代码是无数异常交织起来的偶然产物,代码发生异常才是正常情况。
除了在关键的地方加上 try-catch
让它们变成已知异常之外,抓到未知异常才是真本事。
比如下面的一段代码中的try-catch
是无效的:
|
|
好在,Dart 有一个 Zone
的概念,有点类似sandbox
的意思。不同的 Zone 代码上下文是不同的互不影响,Zone 还可以创建新的子Zone。Zone 可以重新定义自己的print
、timers
、microtasks
还有最关键的how uncaught errors are handled
未捕获异常的处理
|
|
在 reportError
里即可以进行上报处理(详见后面介绍)。
Flutter framework 异常捕获
注册 FlutterError.onError
回调,用于收集 Flutter framework 外抛的异常。
|
|
该 error 一般是由 Widget
在 build
的时候抛出,如下:
|
|
该代码有删减,具体请参看framework.dart源码。其中的_debugReportException
就是 FlutterError 的调用点:
|
|
Flutter engine 异常捕获
flutter engine 部分的异常,以Android 为例,主要为 libfutter.so
发生的错误。
这部份可以直接交给native崩溃收集sdk来处理,比如 firebase crashlytics、 bugly、xCrash 等等
reportError 堆栈上报
线上app 出现异常虽然捕获了,但只是打印出来是没办法解决问题,还需要把他上报到开发者能看到的地方。
上面提到了许多崩溃收集的sdk,以 bugly 为例,它支持自定义异常上报,我们只需将 dart 异常及堆栈通过 MethodChannel
传递给 bugly sdk 即可。
Dart:
|
|
Android Java代码如下:
|
|
iOS 类似的注册一个MethodChannel并在handleMethodCall
中调用 Bugly 的reportExceptionWithCategory
即可。
其它的sdk类似处理,此处略过不表。
堆栈还原
收集到异常之后,需要查符号表(symbols)还原堆栈。下面以Android 端 bugly 收集到堆栈为一例:
|
|
首先需要确认该 flutter engine 所属版本号,在命令行执行:
|
|
输出如下:
|
|
可以看到 Engine 的 revision 为 52c7a1e849。
其次,在 flutter infra 上找到对应cpu abi 的 symbols.zip 并下载 :https://console.cloud.google.com/storage/browser/flutter_infra/flutter/52c7a1e849a170be4b2b2fe34142ca2c0a6fea1f/android-arm-release
解压后,可以得到带有符号信息的 debug so 文件—— libflutter.so,并将其放到文件夹 armeabi-v7a 下。如需要x86等的符号信息,类似操作。
|
|
使用 ndk-stack
Android 上手动还原 libflutter.so 堆栈,可以使用 NDK 提供的工具 ndk-stack
-
将原始堆栈保存到 stack.txt 中,注意第一行要以
*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
开头1 2 3 4 5 6 7
*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** 1 #00 pc 00016998 /system/lib/libc.so (__memcpy_base+104) [armeabi-v7a::2b2dac1c583b68da2f7c58e7ed352851] 2 #01 pc 00158aed /data/app/com.netease.cartoonreader-1/lib/arm/libflutter.so [armeabi-v7a::2c9d8634bdb07ea641970181b0b00b84] 3 #02 pc 00138041 /data/app/com.netease.cartoonreader-1/lib/arm/libflutter.so [armeabi-v7a::2c9d8634bdb07ea641970181b0b00b84] 4 #03 pc 00139461 /data/app/com.netease.cartoonreader-1/lib/arm/libflutter.so [armeabi-v7a::2c9d8634bdb07ea641970181b0b00b84] 5 #04 pc 00013057 /system/lib/libutils.so (_ZN7android6Looper9pollInnerEi+530) [armeabi-v7a::ac423f49f579c99cfababb65014363e9] ...
-
执行ndk-stack命令
1
$ANDROID_NDK/ndk-stack -sym ~/Downloads/flutter-52c7a1e849/armeabi-v7a -dump stack.txt > re-stack.txt
打开文件 re-stack.txt 即可看到还原后的堆栈:
|
|
bugly 自动还原堆栈
一个个崩溃堆栈手动还原多麻烦(噫 你怎么这么多崩溃),下载好 debug so 之后你也可以使用 bugly给的符号表上传工具上传到bugly上,文档见:https://bugly.qq.com/docs/user-guide/symbol-configuration-android/?v=20181014122344#_4
输出符号表:
|
|
将符号表上传之后,bugly 会自动将堆栈还原,如下图所示
使用 atos
iOS上的 Flutter 引擎崩溃堆栈还原步骤和 Android 类似,先下载对应的符号表(Flutter.dSYM.zip),然后通过 atos
还原,如:
|
|
输出:
|
|
本文完,如你更好的方案请不要犹豫快留言告诉我。
*
*
这部分是给看到后面的读者的一个福利 <(▰˘◡˘▰)>
如果你不想使用第三方的错误收集平台,可以用 https://github.com/flutter/sentry 和 https://sentry.io的开源版 配合使用搭建自己的后台。另外我fork的版本 https://github.com/yrom/sentry/tree/2.2.0-patch 使用幸福感更高~。
版权声明
本文为[osc_p23q7y3z]所创,转载请带上原文链接,感谢
https://my.oschina.net/u/4276629/blog/4906209
边栏推荐
- OPTIMIZER_TRACE详解
- 使用Consul实现服务发现:instance-id自定义
- OPTIMIZER_ Trace details
- Using consult to realize service discovery: instance ID customization
- Summary of common string algorithms
- Summary of common algorithms of linked list
- Linked blocking Queue Analysis of blocking queue
- 构建者模式(Builder pattern)
- Builder pattern
- Newbe.ObjectVisitor 样例 1
猜你喜欢
-
Newbe.ObjectVisitor Example 1
-
Farewell to runaway
-
LeetCode Algorithm 0060 - Permutation Sequence (Medium)
-
编程基础 - 栈的应用 - 混洗(Stack Shuffling)
-
LeetCode Algorithm 0060 - Permutation Sequence (Medium)
-
Fundamentals of programming stack shuffling
-
【色卡】常用色谱简析,中国传统颜色卡,代码附RBG,HC
-
[color card] brief analysis of commonly used chromatograms, Chinese traditional color cards, code with RBG, HC
-
MongoDB 副本集之入门篇
-
Introduction to mongodb replica set
随机推荐
- My name is mongodb, don't understand me. After reading my story, you will get started!
- roboguide破解安装教程
- Roboguide cracking installation tutorial
- The transformation of town street intelligent street lamp under the industrial intelligent gateway
- Remote smoke monitoring of environmental protection data acquisition instrument under Internet of things
- JS实现鼠标移入DIV随机变换颜色
- Flutter 页面中的异常处理ErrorWidget
- Exception handling errorwidget in fluent page
- Bolt's practice of route management of flutter (page decoupling, process control, function expansion, etc.)
- C语言系统化精讲 重塑你的编程思想 打造坚实的开发基础
- Skywalking系列博客6-手把手教你编写Skywalking插件
- Skywalking series blog 7 - dynamic configuration
- Skywalking series blog 6 - help you write skywalking plug-in
- 博客主机_自动申请续期免费证书
- Blog host_ Automatic renewal of free certificate
- 0x05 - 综合示例,导出 CSV
- 0x05 - synthesis example, export to CSV
- 0x02 - create and cache object visitors
- flutter圆形或线型进度条
- flutter给滚动内容添加粘性header组件
- Fluent round or linear progress bar
- Fluent adds sticky header components to scrolling content
- Typora uses latex to insert mathematical formulas
- 配电自动化终端dtu
- How to write a thesis opening report
- 基于C的PHP快速IP解析扩展,IP检测
- Based on C PHP fast IP resolution extension, IP detection
- 点击平滑滚动效果
- Click smooth scrolling effect
- HighGo Database触发器使用案例(APP)
- Use case of highgo database trigger (APP)
- ES6之Map对象
- Flutter 最常出现的错误
- Flutter's most common mistakes
- Capture and report the crash log of the flutter app
- SQL Server递归查询在Highgo DB中实现 (APP)
- Implementation of SQL Server recursive query in highgo dB (APP)
- 关于browserslist配置项
- About browserlist configuration items
- FTK1000使用视频一招搞定多模光损耗