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导出来继续分析
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • mysql 环境_MySQL怎么配置环境变量?「建议收藏」

    mysql 环境_MySQL怎么配置环境变量?「建议收藏」安装完MySQL后,如果不配置环境变量的话,每次还要转到mysql/bin目录下才能操作,下面本篇文章就来给大家介绍一下如何配置环境变量,希望对大家有所帮助。MySQL配置环境变量的步骤:1、右键【我的电脑】,选择【属性】2、选择左侧的【高级系统设置】3、在弹出的窗口点击右下角【环境变量】4、点击新建,在弹出窗口变量名输入mysql_home,变量值输入你的mysql安装路径,如图:5、编辑Pat…

  • hdu 5187 高速幂高速乘法

    hdu 5187 高速幂高速乘法

  • PHP操作MySQL对表增加一列(一个字段)

    PHP操作MySQL对表增加一列(一个字段)

  • MFC进度条控件颜色的设置

    MFC进度条控件颜色的设置平台:VS2013内容介绍:创建进度条控件ProgressControl控件并给它颜色的设置。在VC6.0里头可以直接用SendMessage函数就可以设置颜色了,但是在VS里头是不行的,要对进度条进行重绘。第一步:创建一个基于对话框的工程,并在对话框中拖动一个进度条控件,把属性smooth设置为True。Vertical属性是False的话就是水平。如果是True的话就是垂直增长的。第二步:1…

  • 《拐点》简单选股绝招

    《拐点》简单选股绝招最近解股中总是发现大家的问题一再重复,急于寻找股票。其实你一直在找鱼,好不容易你找到一条鱼,明天又不知道如何去找鱼,传统的办法会是一个永远都解决不了的办法。本博试图告诉大家一个简单的办法,或许是找到渔的办法。   如何挑选股票,这是散户朋友最关心但又是最头痛有问题。朋友们总是不知如何选择股票,到处打听买什么股票。但往往买入后还是被套住。问题出在那里。本博告诉一个选择…

  • voliate关键字原理

    voliate关键字原理被volatile修饰的变量在编译成字节码文件时会多个lock指令,该指令在执行过程中会生成相应的内存屏障,以此来解决可见性跟重排序的问题。voliate关键字作用静止重排序保证变量赋值操作的顺序与程序代码中的执行顺序一致。线程可见性原理使用场景…

发表回复

您的电子邮箱地址不会被公开。

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