NE问题分析

一.crash(NE)问题1.找到堆栈信息一般堆栈在Androidlog或者tombstore里面,androidlog里面直接搜libsurfaceflinger或者surfaceflinger定位到log,SW-WDtombstore文件是系统在系统发生NE是抓到的堆栈信息,可能会包含多份文件,找的需要的即可2.解析堆栈backtrace信息,主要看调用栈,我们能从中得到发生问题的具体代码行号,比如:#01pc00000000000642fc/apex/com.android

大家好,又见面了,我是你们的朋友全栈君。

一. crash(NE)问题

1.找到堆栈信息
一般堆栈在Android log或者tombstore里面,android log里面直接搜libsurfaceflinger或者surfaceflinger定位到log,SW-WD
tombstore文件是系统在系统发生NE是抓到的堆栈信息,可能会包含多份文件,找的需要的即可
2.解析堆栈
backtrace信息, 主要看调用栈,我们能从中得到发生问题的具体代码行号,比如:

#01 pc 00000000000642fc  /apex/com.android.runtime/lib64/bionic/libc.so (je_free+116) (BuildId: 554cb674fad07588ff08040bb89924c9)

#01                                               //帧栈编号
00000000000642fc                                  //so内偏移地址
/apex/com.android.runtime/lib64/bionic/libc.so    //具体执行在哪个so
je_free                                           //具体执行在哪个函数
+116                                              //函数内偏移地址

具体方法是使用工具addr2line得到对应文件和行号
addr2line -Cie 具体so so内偏移地址

3.分析
1).常见的空指针解应用类问题采取规避方法进行判空处理,举例:818848 488093 330523
2).根据代码推断出是多线程的访问竞争引起的问题,比如图层在子线程析构类的,由于图层或者buffer释放后使用或者重复释放造成的问题,通常进行加锁处理 举例:1112033
3).内存踩踏问题,通常不容易处理,因为发生踩踏和真正导致sf crash往往时间点和代码位置都没有相关性,如果能猜测到可能的代码逻辑可以加log复测,如果比较随机,就需要使用HWASan(内存踩踏检测工具)进行复测
开启HWSan方法:
对于整个系统开启: 构建版本时添加属性: SANTIIZE_TARGET=“hwadress”
单独对sf进程开HWSan: 根据具体crash的点开对应so的HWSan,比如:
libgui.so: http://gerrit.scm.adc.com:8080/#/c/9367352/
libsurfaceflinger.so: http://gerrit.scm.adc.com:8080/#/c/9367154/4/libc/Android.bp
HWSan分析方法:
HWSan复现问题后在android log中会明确指出问题发生的直接原因,搜索关键字: AddressSanitizer:
如何确定HWSan是否打开成功:
通过DPS命令, adb shell dumpsys Surfaceflinger –dps –debug-asan 去触发一个数组越界,log中有asan相关log就是触发成功
或者直接adb pull打开HWASan的lib,搜关键字hwsan,lize._hwsan_in即为开启成功
4).主动触发coredump
产生的coredump文件在/data/core下
5).MTK db
MTK平台在发生NE,SWT,ANR时会产生db.db就是包含各种debug需要的log,堆栈,coredump,CPU,GPU,内存,文件系统信息的压缩包
MTK发生NE后生成的db文件在目录/data_aee下以.NE结尾
db分为fatal和非fatal,sf,system server等系统关键进程的NE都是fatal的,所以只需要关注fatal的就行了,可以打开db_history搜索进程关键字来找到对应的db文件
db文件一般提供给MTK分析,我们也可以使用MTK QAAT工具自己去解dbg文件 https://eservice.mediatek.com/eservice-portal/issue_manager/update/96659541 ALPS05600986这个case直接申请下载就行了

二.sf hang问题

hang就是卡死,sf这边实现了看门狗nwachcall,当sf卡死主线程和binder线程卡死超过3s后,会抓取log,堆栈信息保存到本地,并且会通过EAP回传
1.获取卡死时的堆栈信息
  完整logkit工具抓的log包,nwatchcall log放在log.tar.gz压缩包里面,或者是log文件夹下/data/persist_log/DCS/de/psw_multimedia_perf,这里面最重要的一个文件就是nbacktrace,保存了sf卡死时堆栈的信息
  有一点,有时候问题是底软的同事转过来的,他们通过监控系统SWT重启,发现是因为sf造成的卡死,题中的log只有他们的SWT回传,没有nwatchcall回传,所以需要联系测试去eap系统下载才行
2.分析问题
  sf卡死一般分为以下几种
  1).sf自身逻辑造成的卡死,一般是死锁
  2).驱动或者gpu造成的卡死,一般伴随fence timeout,或者hwcomposer驱动异常log,看堆栈是否挂在gpu库里
  3).系统运行缓慢,io,cpu,loading过重导致sf运行缓慢,这种情况sf连续两个时间点的堆栈不一样,这时候要看log上有没有lmk或者lowmem字样,分析是否是系统问题
  4).sf被binder阻塞,比如虚拟屏(sf作为bufferqueue的生产者,要queue buffer)卡死,或者sf notifylistener时app不响应binder卡死等,这类问题要看binder对端的状态,可能是对端被冻结,或者binder耗尽
  总之就是找到证据转给对应的模块

三.定屏黑屏问题

1.连接adb执行   ps -A|grep surfaceflinger
确定sf的pid是否较大(一般sf比较小,1000以内),确定sf是否crash过.sf作为系统关键进程,crash后android会重启,重启后新分配的sf pid会比较大,几千,
2.得到sf pid后执行   debuggerd -b {sf pid}
得到sf的堆栈,可以多执行几次,抓到不同时间点的堆栈,到这一步,基本可以确定黑屏或者定屏是不是sf本身能够造成的卡死了
3.执行截图命令 如果能成功截到图,基本判断是驱动问题  screencap -p /sdcard/1.png
4.如果上面确定是sf卡死造成的,则 adb pull /data/persist_log/DCS/de/psw_multimedia_perf 把nwatchcall抓到的现场堆栈和log导出来继续分析
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/127224.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • 《TCP/IP具体解释卷2:实现》笔记–IP:网际协议

    《TCP/IP具体解释卷2:实现》笔记–IP:网际协议

    2022年2月5日
  • origin相关绘图操作[通俗易懂]

    origin相关绘图操作[通俗易懂]博客的另外地址:http://www.datalearner.com/blog/1051510886845466日常绘图时,会使用都origin,其是一款非常强大的制图工具,以下内容,会记录我使用过的功能,使用方法操作。其强大的功能,我认为就是图层的使用,可以绘制多张图,利用图层管理将多张图进行合并,而且操作随意性好。如下,是我从网络上截取的几张图。origin添加数据origin添加数据非

    2022年5月6日
  • 基于阿里DDNS的ipv6 for windows版软件

    基于阿里DDNS的ipv6 for windows版软件基于阿里DDNS的ipv6forwindows版软件会搜到这篇帖子的同学,应该和我一样,满世界为自己的虚拟主机找寻ipv6的动态ddns程序吧?下面我先说说我的折腾故事:因为买了群晖,然后发现需要公网ip,但公网ip现在电信要钱了,开口100元一个月,挺黑的。没办法尝试了各种内网穿透,这类帖子网上很多,就不细说了,总之是各种折腾,各种不爽,最终选择了零遁伴侣做内网穿透还算稳定,速度也不错。…

    2022年6月13日
  • 怎么反编译dll文件(反编译dll查看源代码)

    DLL(DynamicLinkLibrary)文件为动态链接库文件,又称“应用程序拓展”,是软件文件类型。下载并解压.NETReflector,下面下载为绿色7.3.0.18版本;(注:此为英文版,百度有汉化版下载)链接:https://pan.baidu.com/s/1eoWFe62wA_uOdn3wTQ7e-w密码:gt87…

    2022年4月12日
  • 遍历Arraylist的三种方法及优缺点简单介绍

    遍历Arraylist的三种方法及优缺点简单介绍集合ArrayList是接口List的一种子类,它的特点是:存储的元素是有序的.底层的数据结构是数组.查询快,增删慢.在众多集合中ArrayList的遍历又是比较特殊的,下面就写一下它的三种遍历方式,代码如下:第一种遍历方式:普通for循环第二种遍历方式:增强for循环第三种遍历方式:迭代器importjava.util.ArrayList;importjava.util.Iterator;/***PACKAGE_NAME*/publicclassDemo.

    2022年7月22日
  • 如何用phpmyadmin导入大容量.sql文件,直接使用cmd命令进行导入

    如何用phpmyadmin导入大容量.sql文件,直接使用cmd命令进行导入

    2021年10月15日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号