移动端堆栈关键行定位的新思路

简介: 崩溃堆栈是我们日常应用问题排查中的重要辅助手段,在移动开发上也不例外,为了支持用户在堆栈上的快速定位,我们面临一个看似比较简单问题:高亮崩溃中的关键行, 辅助用户快速定位问题。

阿里云 云原生应用研发平台EMAS 张月(此间)

一、前言

崩溃堆栈是我们日常应用问题排查中的重要辅助手段,在移动开发上也不例外,为了支持用户在堆栈上的快速定位,我们面临一个看似比较简单问题:高亮崩溃中的关键行, 辅助用户快速定位问题。
崩溃堆栈关键行: 堆栈中是属于用户开发代码中那行直接引起崩溃的代码。
举个例子:
image.png

二、 业界方案

业界的竞品基本上是通过 Package Name判断的,在没有 Package Name 的情况下,有的竞品会定位到第一行,有的则会定位到非系统库的第一行。
例如: 友商这种情况下就将关键行挂在了第一行 fastjson 的位置。
image.png

这里容易出现两个问题:
1.Package Name 大多数时候和真正的崩溃包名关系不大。
2.App 组件化,包名不能覆盖一方库,二方库。
为了更好的解决这个问题,我们提出了下面用词频比/词频分的方式来解决问题的新方案。

三、新方案

所以在 Package Name 的基础上,我们还需要一个辅助手段,让我们能够识别这两种情况,从而在关键行定位更精准。

这里我们想到的一个做法就是利用全量的 Crash 崩溃堆栈,计算词频比和相应的词频分,通过概率去优化我们的关键行判断。

实现上分为两个平台。

3.1 对于 iOS

1)主包判断

这个问题,对于 iOS,其实不用考虑用户填写的 Bundle ID, 因为 IOS Crash 天然就自带 Binary Images,我们将用户主包信息预存下来,用于后续判断就行了。
Binary Images
image.png

2)直接定位:

image.png

对于组件化的包,我们可以通过 Binary Images 里面的信息统计一下每个包名出现的频率,具体的频率分布统计大致如下图所示,纵坐标代表包名出现的次数:

-> 注:横坐标为包名(这里放不下),纵坐标为包名出现次数
image.png

出现的频率越低,那么我们越认为他是一方库或者二方库。

3.2 对于 Android

对于 Android,情况稍微复杂一点,首先 Android 的 Crash 中其实是不能明确标识包名的,而且 Android 的 Package Name 并不是一个词,而是一长串的以点分隔的包名, 例如

"com.aliyun.emasha.cache"。

如果单纯的还以包名的词频比来做匹配的话,那么就会出现下面的问题
a.历史数据 只出现 com.aliyun.emasha.cache 的包名, 下次出现个 com.aliyun.emasha.login 的就匹配不上了。
b.同样是 com.aliyun.emasha 的前缀,匹配到了 com.aliyun.emasha 和匹配到了 com.aliyun.emasha.cache 包名的词频相差很大,不符合常理。

所以还要解决这两个问题
a.能够尽可能的覆盖未出现的崩溃情况。
b.随着匹配的前缀越长,需要考虑前面的包名匹配带来的影响。

所以这里要引入包名分级和词频分的概念
a.包名分级:将包名 split(".") 得到数组,从前往后为 1级,2级,3级这样的分级。
b.包名词频分:根据包的词频比多级累加算出来的一个评价包名是否是三方库的分数,分数越高,是三方库的几率越大。

但这还不够,如果我们的词频比只是单纯的累加,那么 com 开头的的包名,词频分一定会很高,大于所有的 org 开头的包名,但根据我们的经验,其实不是这样的,我们认为不同级别的匹配,权重应该是不一样的,所以我就拍脑袋想了个权重。

0 5 2 1 1 1

这里举个例子

com.alibaba.aliyun.emas.ha.tlog 这个包名
com 1
com.alibaba 0.3
com.alibaba.aliyun 0.1
com.alibaba.aliyun.emas 0.05
com.alibaba.aliyun.emas.ha 0.02
com.alibaba.aliyun.emas.ha.tlog 0.01

如果匹配到 com 那么词频分为 1 * 0
如果匹配到 com.alibaba 那么词频分为 1 0 + 0.3 5 = 1.5
如果匹配到 com.alibaba.aliyun 那么词频分为 1 0 + 0.3 5 + 0.1 * 2 = 1.7
以此类推

但是在我们的经验中匹配到了 com.alibaba 和匹配到了 com.alibaba.aliyun,后者更有可能是关键行,所以它的词频分按理来说也就更低。所以我们这里做一个符合常理的修正,对于位数过短的匹配,需要后几位的权重做补齐。

最终结果如下:
如果匹配到 com 那么词频分为 1 0 + 1 5 + 1 2 + 1 1 + 1 1 + 1 1 = 10
如果匹配到 com.alibaba 那么词频分为 1 0 + 0.3 5 + 0.3 2 + 0.3 1 + 0.3 1 + 0.3 1 = 3
如果匹配到 com.alibaba.aliyun 那么词频分为 1 0 + 0.3 5 + 0.1 2 + 0.1 1 + 0.1 1 + 0.1 1 = 2

看上去是比较符合我们的经验的。

所以这里词频分的最终定义:根据包的词频多级累加算出来的一个评价包名是否是三方库的分数,分数越高,是三方库的几率越大。如果一个包名分级过短,需要把缺失的后面分级的也算上累加,用于增大短包名的词频分。

我们对所有的包做一个词频分统计,可以得到如下分布图

-> 注:横坐标为包名(这里放不下),纵坐标为包名的词频分
image.png

根据观察和测试,这里把阈值定在 0.2 左右比较能区分用户的包名和三方、系统库。

3.3 整体架构

在工程实现上我们也做了一些优化
1.以前业务数据是存储在 OSS 中的,但是 EMR-OSS 目前文件处理较慢,这里换成了更适合并行处理的 HBase。
2.只计算增量 Crash 日志, 对于存量的数据,以 HyperLogLog 的形式存储,增量计算后与存量做 Merge。
image.png

四、效果评估

常规的利用 Package Name 做判定: F1 Score
image.png

使用词频分思路的:F1 Score
image.png

五、真实效果评估

上面的效果评估只考虑到了每一个包名的情况,在生产因素下,考虑到崩溃行出现的位置,包名出现的频率,以及没关键行的情况,准确率可能会有所不同,所以我们在真实环境做了高亮测试,测试方式为:对线上50个 App,每个 App 取前3条崩溃来做统计,总的准确率如下,可以说是比较高的。

安卓准确率:(333-9)/(333)*100%=90.91%
iOS准确率:(173-0)/(173)*100%=100%
总体准确率:(503-9)/(503)*100%=94%

六、思考

小需求可以做出大深度, 后续我们可以考虑更多跨用户数据的脱敏拉通,理解数据,为客户带来更多的数据价值。

七、接下来的方向

1.组内算法的朋友说可以通过打标 + CNN 的方式来做深度学习下的三方包名判断, 这个后续可以试一试。
2.对于凭经验拍脑袋相出来的参数和方程(词频分计算),其实都可以通过打标训练的方式做参数和方程的固定,这也是一个优化方向。

八、写在最后

移动研发平台 EMAS

阿里巴巴应用研发平台 EMAS 是国内领先的云原生应用研发平台(移动App、H5应用、小程序、Web应用等),基于广泛的云原生技术(Backend as a Service、Serverless、DevOps、低代码等),致力于为企业、开发者提供一站式的应用研发管理服务,涵盖开发、测试、运维、运营等应用全生命周期。
欢迎大家移步使用:https://cn.aliyun.com/product/emas

相关文章
|
编译器 测试技术 开发工具
让你的 XCode 编译链接耗时减半
让你的 XCode 编译链接耗时减半
2080 0
让你的 XCode 编译链接耗时减半
|
缓存 监控 小程序
App性能测试揭秘(Android篇)
性能测试在移动测试领域一直是一个大难题,它最直观的表现是用户在前台使用 App 时的主观体验,然而决定体验优劣的背后,涉及到了许许多多的技术变迁。阅读此文,带你揭秘App性能测试。
6051 0
App性能测试揭秘(Android篇)
|
2月前
|
人工智能 前端开发 Java
AGENTS.md完整落地实践:一份文件翻倍AI编码效率实操指南
在AI编程工具广泛普及的当下,Cursor、Claude Code、Copilot、各类智能体工具各自使用独立规则文件,团队需要维护多套配置,切换工具时重复同步编码规范,AI对项目架构、私有组件、构建流程一无所知,产出代码大量不符合团队标准,反复人工修改大幅拉低开发效率。AGENTS.md作为统一行业标准,完美解决配置碎片化、AI缺少项目上下文的痛点,仅在仓库根目录放置一份Markdown文件,即可让全部AI编码工具统一读取项目规则、架构、构建命令,搭配配套工程脚本,实现「AI读懂项目、写完自动自检、自主验证功能」完整闭环,显著提升AI编码产出质量与整体研发效率。本文结合Spring Boot
462 0
|
9月前
|
监控 算法 开发工具
用户说“App 卡死了”,你却查不到原因?可能是监控方式错了
iOS 卡顿难复现?传统监控抓不到根因?本文深入剖析 iOS 主流卡顿监控方案,重点揭秘生产级可用的 RunLoop 监控实现:如何在不影响性能的前提下,精准捕获主线程阻塞、提取耗时堆栈,并通过退火算法避免重复上报——现已集成于阿里云 ARMS iOS SDK。
802 66
|
7月前
|
人工智能 安全 搜索推荐
2026 AI 元年:大模型到智能体的技术落地革命
2026 年被公认为 AI 元年,核心标志是 AI 发展重心从大模型的理论探索转向智能体的规模化落地。历经 2022 年以来的技术沉淀,GPT、文心一言等大模型构建起坚实的能力底座,支撑智能体实现 “感知 - 决策 - 执行 - 优化” 的闭环能力,完成了 AI 从 “能理解” 到 “能行动” 的关键跃迁。本文聚焦这一变革,剖析技术演进、产业价值与落地逻辑,梳理核心挑战并展望未来趋势,为把握产业智能化转型提供精准参考。
3456 0
|
8月前
|
机器学习/深度学习 人工智能 测试技术
2025年终端应用全链路性能测试实施策略与实践对比
介绍2025年终端应用全链路性能测试面临的挑战及主流实施方案,包括云真机兼容性测试、SaaS化压力测试平台、AI驱动的自动化测试工具。对比三者原理、优势、局限及适用场景,给出分阶段实施策略、关键成功要素和风险规避方法,还解答常见方案选择等问题。
|
监控 Java 应用服务中间件
达梦数据库DEM监控部署教程分享
达梦数据库DEM监控部署教程分享
1591 2
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的学生签到系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的学生签到系统的详细设计和实现(源码+lw+部署文档+讲解等)
381 5
|
监控 测试技术 开发工具
移动端性能测试工具
移动端性能测试工具
1642 2
|
存储 缓存 开发工具
Xcode 清理大法
Xcode 清理大法
1945 0