FAQ#
一、术语#
异常次数率:统计周期内(小时/天),异常发生次数/应用冷启动次数;
异常设备率:统计周期内(小时/天),异常发生设备数/总设备数;
总异常设备率:选定时间范围内,出现异常的总设备数/启动应用的总设备数;
平均异常设备率:选定时间范围内,每天或每小时异常设备率的平均值;
异常设备周同期差:今日设备异常率-七日前设备异常率:
说明:例如,当前时间为周一10:30 今日设备异常率=今日00:00-10:30的设备异常率 七日前设备异常率=上周一00:00-10:30的设备异常率
二、原理#
-
卡顿的判断逻辑是什么?
安卓和iOS原理一致。
开启一个检测线程,每隔固定时间(默认5s)向主线程发送消息,5s后检查消息是否被响应。若无响应,则认为发生了卡顿。
-
iOS卡死崩溃和FOOM(foreground out of memory)崩溃的判断逻辑是什么?
以上两种崩溃是资源使用达到上限,被系统强杀,在app内是无法感知到被强杀的,因此需要额外的判断。
判断逻辑参考了Facebook的文章:https://code.fb.com/ios/reducing-fooms-in-the-facebook-ios-app
核心原理是在app运行过程中,保存app状态信息,下次启动时读取app状态信息。用排除法判断app上次是否发生崩溃、是否用户自行退出、应用版本更新重启、系统更新、系统重启,以上情况排除后再判断是否为FOOM或卡死崩溃。
注意:使用_exit()退出应用时,无法执行保存app状态信息的函数,可能发生误报,应使用exit(),或者在退出前调用SDK提供的notifyAppWillQuit函数通知SDK应用即将退出。
-
iOS FOOM为什么没有崩溃栈信息?
FOOM是因为内存泄漏或内存使用不当造成的,排查FOOM需要获取app运行过程中的内存调用信息(包括泄漏内存的大小以及调用栈)。记录内存调用栈是比较消耗资源的操作,因此暂时没有实现此功能。如有需要可与我们联系。
-
是否与其他崩溃捕获SDK兼容?
安卓、iOS、鸿蒙SDK兼容。若最后初始化,捕获到崩溃信号并处理成功后交给上一个handler处理。但并不建议在一个应用中使用多个崩溃捕获SDK,可能出现未知的bug。
-
ANR的判断原理是什么?哪些情况会造成ANR?
ANR是通过SIGQUIT信号捕获的。ANR是由操作系统判断的,不同厂商或者系统版本的设备,判断的条件可能有差别。出现ANR时,大部分手机会弹出应用无响应弹窗,有些品牌比如oppo, vivo会直接杀死app。
ANR发生的主要原因有:
系统资源紧张,比如CPU过载、内存不够、I/O读写速度慢;应用程序的主线程执行耗时函数,或者出现死锁;页面帧刷新出现严重卡顿,无法响应用户输入等。
三、数据#
-
为什么有的字段值为0或空?
触发崩溃时,我们尽量在应用退出前采集运行时信息。但出现堆溢出等问题时,无法执行完整的崩溃处理流程,因此会有部分运行时信息丢失。
-
为什么ECat上的设备数与运营数据不同?
ECat的设备数由设备id去重统计,设备id在应用首次启动时生成并保存在设备本地。
对于安卓和Windows应用,若应用被卸载或清除应用数据,设备id会丢失,当重新安装启动后,会生成一个新的设备id。
对于iOS应用,设备id保存在keychain中,应用卸载或清除数据不会丢失设备id。但设备恢复出厂设置,则会丢失设备id,当重新安装启动后,会生成一个新的设备id。
因此,一般情况下,ECat统计到的设备数始终大于等于真实设备数。
四、符号#
-
同名的符号文件,新版本会覆盖旧版本吗?
对于Native符号文件和iOS符号文件,以UUID确认其唯一性。仅在UUID相同,MD5不同时才会发生覆盖。
对于其他符号文件,以appVersion确认其唯一性。appVersion相同,MD5不同时会发生覆盖。
五、功能#
-
重还原功能有什么用?
用于Native崩溃和iOS崩溃的符号还原,在上传符号文件后,可还原30天内已发生的崩溃。
-
ECat能否获取系统日志?
在安卓下可以。
在获得用户授权后,设置setPermission("READ_LOGS", true)即可在异常时获取系统日志。系统日志是用logcat命令获取的,配置了READ_LOG权限后,所有异常数据都会携带systemlog。
-
获取系统日志的性能消耗如何?
单次执行logcat对效率的影响很小。如果C#或lua异常频繁触发,因为SDK有上报抑制,只有在需要上传的时候才会获取系统日志。