Bugly专业版,提升Crash问题可解性
随着业务场景越来越复杂,部分疑难问题令人头痛,随机不好重现,仅仅依靠现有的堆栈信息难以定位问题。在这类问题中,由于内存、FD使用不当导致的异常占据了很大比重,堆栈通常不是“案发现场”,只能在日志中获取到“Too Many Open Files!”、“java.lang.OutOfMemoryError!”等提示信息,解析这类问题往往无从下手。
基于上述场景,Bugly专业版通过收集更多辅助信息,提高疑难问题的可解性。
接入文档:Android | Bugly 专业版
一、 FD信息
在排查FD泄漏、FD触顶问题时,或是特定问题中希望查找某个FD是否被打开被关闭时,FD信息能帮助业务快速定位问题。
基于此,我们在发生Crash和ANR时,收集并统计当前设备使用FD情况,在“消息详情”中的“FD信息”tab中进行展示。首行展示当前进程已使用FD数、未使用FD数和最大可用FD数。
在FD的展示表格中,为了方便统计和查找,我们将FD使用情况按类型归类,并统计了每个类别的数量、占比,这样可以快速查看进程中的FD都是被什么类型的文件占据。在详情中,展示了对应的FD指向路径,以及指向该路径的FD数量,这样可以很方便地知道每个路径被打开了多少次。
如果希望利用上报的FD信息进行进一步查找,Bugly在附件“CrashInfo“中提供了记录的源FD信息。
二、 系统日志
系统日志是Crash问题解析的关键,我们经常能在系统日志中收集到一些非常有价值的线索。Bugly2.0优化调整了日志抓取时机,抓取的日志紧贴Crash时间,精确到发生Crash前到Crash时的范围,能拿到更多、更准的系统日志。
三、 进程信息
我们关注到进程信息对于Crash问题的解析同样重要。通过调研整理,我们采集了包括进程的内存及分布情况、进程的状态、进程中线程的状态等进程信息。在发生native Crash和ANR时,收集并展示以下几种类型的进程信息。
首先是进程的内存区域映射信息,也叫maps信息,是用户进程运行时的内存映像,能够查看到当前进程空间的内存映射情况,模块载入情况以及虚拟地址和内存读写运行(rwxp)属性等。
该内存区域映射信息在“消息详情”中的“进程信息”tab中,“Maps信息“子tab中进行展示,并支持通过起始地址、结束地址、内存段名的模糊搜索,访问权限的全匹配搜索。
同时,在进程发生OOM时,考虑业务可能希望知道当前进程中主要进行了哪种类型的内存分配;或是通过内存的分配情况,反推是否有内存泄漏、内存溢出的风险。针对此类情况,我们提供了进程的内存分析,统计进程中的内存分配情况。
该内存分配情况称为meminfo信息,代表着指定进程的内存使用情况,可以查看应用当前的内存主要被分配在哪里。(如native heap分配高,就要查一下自己的native部分的代码哪里分配后没有及时释放)
meminfo信息在“消息详情”中的“进程信息”tab中,“Meminfo信息“子tab中进行展示。
其中,内存指标(横坐标)释义可参考如下表格。
内存种类(纵坐标)释义可参考如下表格。
在发生Crash或ANR时,进程的状态也至关重要。我们可以通过进程状态来侧面了解进程的运行是否正常。
进程状态信息记录了进程运行时的所有状态,在“消息详情”中的“进程信息”tab中,“进程状态”子tab中进行展示。
其中,上述进程状态信息的字段解析可参考
proc(5) - Linux manual page
进程中各个线程的状态也同样值得关注。我们同样收集了线程状态来了解Crash进程中各个线程的运行是否正常。
线程状态信息在“消息详情”中的“进程信息”tab中,“线程状态”子tab中进行展示。可以点击左侧箭头展开单个线程的状态信息。将鼠标hover至对应的字段上方,可展示该字段的中文释义,无需查找文档即可了解线程的状态值含义。
为了方便这些进程信息的导出,在附件“state_file.zip“中也提供了上述信息的源内容,可以自行下载文件在本地进行查看。
四、 更多的tombs信息
在发生native Crash时,我们可能会碰到一些仅通过堆栈难以解决的问题,如调用堆栈基本是系统堆栈的情况,这时候可能会希望有更多的信息来辅助我们排查分析。
在旧版本的bugly中,我们只能抓取到少量的tombstone信息,对native Crash的可解性帮助较小。因此,我们在新版本中优化了tombstone信息的抓取,支持收集更多的tombstone信息。更多tombstone信息的收集需在初始化时设置开启在子进程中dump tombs,在tomb.zip附件中可以查看上报的的tombstone信息。
其中,更多tombstone信息包括Crash时进程的执行堆栈映射情况;
寄存器执行地址的翻译,可以帮助定位执行的函数信息;
系统内存及进程状态在Crash时的状态等;
通过更多的tombstone信息,可以在解析Crash问题时增加更多辅助信息,帮助提高问题的可解性。
五、 体验Demo示例
更多辅助信息的功能展示都可以在Demo中进行体验,Demo链接如下:Bugly 体验 Demo
FUE