【Android】【问题分析】G-sensor因数据交互问题导致手机crash

2023-05-16

G-sensor因数据交互问题导致手机crash

问题现象:

测试同事发现,手机在使用和待机时,低概率发现手机会crash

问题原因:

G-sensor在driver和HAL层因交互的参数不匹配,导致timeout引起的crash,具体log如下:

通过工作抓取到的kernel层的log(截选重要部分)如下显示:

 

<6>[ 7040.264871] SysRq: Show backtrace of all active CPUs

 

<6>[ 7040.264925]Backtrace for cpu 0 (current):

 

<6>[ 7040.264946] CPU: 0PID: 4667 Comm: watchdog Tainted: P       W  O3.10.49-g8347c3d-00015-g4c1aa2f #1

 

<6>[ 7040.265001][<c00132f8>] (unwind_backtrace+0x0/0xe0) from [<c0011084>](show_stack+0x10/0x14)

 

<6>[ 7040.265023][<c0011084>] (show_stack+0x10/0x14) from [<c00125c8>](smp_send_all_cpu_backtrace+0x50/0xcc)

 

<6>[ 7040.265045][<c00125c8>] (smp_send_all_cpu_backtrace+0x50/0xcc) from[<c02fbfec>] (__handle_sysrq+0x9c/0x140)

 

<6>[ 7040.265066][<c02fbfec>] (__handle_sysrq+0x9c/0x140) from [<c02fc3f4>](write_sysrq_trigger+0x38/0x48)

 

<6>[ 7040.265090][<c02fc3f4>] (write_sysrq_trigger+0x38/0x48) from [<c013c124>](proc_reg_write+0x6c/0x80)

 

<6>[ 7040.265113][<c013c124>] (proc_reg_write+0x6c/0x80) from [<c00f66fc>](vfs_write+0xd0/0x180)

 

<6>[ 7040.265134][<c00f66fc>] (vfs_write+0xd0/0x180) from [<c00f6bb8>](SyS_write+0x38/0x68)

 

<6>[ 7040.265152][<c00f6bb8>] (SyS_write+0x38/0x68) from [<c000d700>](ret_fast_syscall+0x0/0x30)

 

<6>[ 7040.265161]

 

<6>[ 7040.265161]sending IPI to all other CPUs:

 

<4>[ 7040.265180] IPIbacktrace for cpu 1

 

<6>[ 7040.265192]

 

<6>[ 7040.265205] CPU: 1PID: 831 Comm: SensorService Tainted: P       W  O3.10.49-g8347c3d-00015-g4c1aa2f #1

 

<6>[ 7040.265215] task:ebce7380 ti: ebf3a000 task.ti: ebf3a000

 

<6>[ 7040.265231] PC isat sub_preempt_count+0x14/0xd4

这段log提供了,从kernellog的时间点看7040打印出堆栈异常信息,换算对应于logcat的19:11:27秒打印出了watchdog 和sensor service的 堆栈,而kernel没有挂掉,仅仅打印出异常堆栈信息,logcat 在19:11:20 秒的时候 watchdog 已经被PowerManagerService block住的信息,而log被保存在了“ Wrote stack traces to'/data/anr/traces.txt'”下 。随即打印主动watchdog 的堆栈(即kernel log的 7040s打印的堆栈信息)“01-01 19:11:27.258   767  4667 I Watchdog_N: dumpKernelStac。而且sensorservice的堆栈信息。所以应该是PowerManagerService 被block主了,要看下/data/anr/traces.txt'的信息。Logcat 里面多次 “watchdog: Blocked in handler onmain thread (main), Blocked in handler on PowerManagerService(PowerManagerService)”而引发kernel 打印堆栈。


同时上层也有抓到具体重启的原因是Watchdog: *** WATCHDOGKILLING SYSTEM PROCESS: Blocked in handler on main thread (main), Blocked inhandler on PowerManagerService (PowerManagerService)

追溯“Blocked in handler on main thread(main), Blocked in handler on PowerManagerService (PowerManagerService)”来源于下段函数任务没完成或者time out导致。

// something is overdue!

                blockedCheckers =getBlockedCheckersLocked();

                subject =describeCheckersLocked(blockedCheckers);

                allowRestart = mAllowRestart;

 

if (hc.isOverdueLocked()) {

                checkers.add(hc);

            }

 

public booleanisOverdueLocked() {

            return (!mCompleted) &&(SystemClock.uptimeMillis() > mStartTime + mWaitMax);

        }

默认的超时时间是6s,也可以调用函数时传入,现在看来应该是传入的数据,而HAL层的数据都是由轮询的方式由底层传入。

static final longDEFAULT_TIMEOUT = DB ? 10*1000 : 60*1000;

static final boolean DB =false;

于是锁定在了PhoneWindowManager.goingToSleep()这里和PhoneWindowManager.screenTurnedOff()持有同一个同步锁导致。screenTurnedOff 在等待 goingToSleep 释放锁,于是导致系统卡在android.hardware.SystemSensorManager$BaseEventQueue.nativeDisableSensor。最后被watchdog 杀掉。


详细逻辑原因:

具体情况是在qcomHAL层里的sensors.cpp下的这个函数

int sensors_poll_context_t::pollEvents(sensors_event_t* data, int count)

在以下的时候,先会拿到锁,然后有查到函数会在sm.readEvents()里面耗费很大时间以致无法解锁,才导致被kill掉。继续往下调查

178 Mutex::Autolock _l(mLock);

179 int nb = sm.readEvents(slist[i].handle, data, count);

180 if (nb < 0) {

181 ALOGE("readEvents failed.(%d)", errno);

182 return nb;

 

ReadEvent()里面会因为下面这段导致不断被循环,而这段循环的要求mEnable =1ok的,而numEventReceived只有在上面一个循环里面才会++

291 if (numEventReceived == 0 && mEnabled == 1) {

292 n = mInputReader.fill(data_fd);

293 if (n)

294 goto again;

295 }

 

在操作numEventReceived变量的函数循环,发现在report事件的时候有如下循环:

257 case SYN_REPORT:

258 {

259 if(mUseAbsTimeStamp != true) {

260 mPendingEvent.timestamp = timevalToNano(event->time);

261 }

262 if (mEnabled) {

263 if(mPendingEvent.timestamp >= mEnabledTime) {

264/* [BUFFIX]-Mod- Begin by TCTNB.XQJ,PR-915938, 2015/2/11, from AKM fae modify,for cts test */

265 raw = mPendingEvent;

266 if (algo != NULL)

267 {

268 if (algo->methods->convert(&raw, NULL, NULL)) {

269 ALOGE("Calibration failed.");

270 }

271 }

272/* [BUFFIX]-Mod- End by TCTNB.XQJ*/

273 *data++ = mPendingEvent;

274 numEventReceived++;

275 }

如红色部分,这里的函数就无法进入,但在reportcase里面,有SYN_TIME_NSEC下有如下操作

245 case SYN_TIME_SEC:

246 {

247 mUseAbsTimeStamp = true;

248 report_time = event->value*1000000000LL;

249 }

250 break;

251 case SYN_TIME_NSEC:

252 {

253 mUseAbsTimeStamp = true;

254 mPendingEvent.timestamp = report_time+event->value;

这样才能理顺这个流程。而如果流程中间卡主,在长事件卡在循环里面,如果7-8秒,会导致无法唤醒,更长时间会导致system crash掉。

 

Best regards,


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Android】【问题分析】G-sensor因数据交互问题导致手机crash 的相关文章

  • navicate连接远程数据库

    远程主机的3306端口一般是不允许外网直接访问的 xff0c 但是开发过程中 xff0c 使用navicate工具进行数据库操作会方便超级多 xff0c 那么要怎么配置navicate连接远程数据库呢 超简单两步走 xff1a 1 使用se
  • idea中Gradle项目控制台中文乱码

    我使用的是IEDA2021 xff0c 之前跑maven项目一切正常 今天导入了一个Gradle项目 xff0c debug的时候控制台中文乱码了 之前直接用idea控制台中文乱码做关键词搜索 xff0c 改了file settings e
  • @RequestMapping value值置为““

    我们通常用 64 RequestMapping来映射请求 xff0c 比如 xff0c 写一个方法 xff1a span class token annotation punctuation 64 RequestMapping span s
  • 三十分钟做一个网页游戏

    本文目的是短时间之内 xff0c 通过做出一个简单的缘分对对碰游戏 xff0c 了解网页的基本要素 之前没有接触过网页开发 xff0c 这次算是个入门了 对于大部分网页 xff0c 都要包括HTML CSS JavaScript三种技术 而
  • 软件安装时窗口出现在屏幕左上角而且拖不出来

    今天在安装MYSQL是出现如下问题 xff1a 安装助手出现在屏幕左上角而且拖不出来 xff0c 导致安装没办法完成 用一个很简单的方法解决了问题 xff1a 桌面空白处右键 xff0c 点屏幕分辨率 把方向改成纵向 xff0c 左上角的窗
  • DELL笔记本插入耳机没反应

    新入的戴尔燃7000 xff0c 上午因为CPU占用飙升 xff0c 关掉了笔记本上的几个自启动项 xff0c 下午插入耳机就无响应了 xff0c 耳机插进去 xff0c 还是外放 百度原因 xff0c 很多都提及了Realtek这一声卡驱
  • the server responded with a status of 404 (Not Found)

    使用ajax跳转方法时 xff0c 页面ctrl 43 shift 43 i调试报告了一个404错误 xff0c 说找不到方法 页面地址栏直接指向方法的地址跳转也是404 目标方法是新增的 xff0c 于是使用复制黏贴 xff0c 确定各处
  • select设置只读

    根据需求 xff0c 需要根据后台传来的参数 xff0c 动态设置select标签是否可以选择 xff0c 因此 xff0c 当判断某个select应当设为只读时 xff0c 使用 span class hljs variable span
  • java:程序包XXXX不存在

    使用idea导入maven项目 xff0c 编译时报错 xff1a java 程序包XXXX不存在 如图 xff1a 百度到的诸如右键libraries所在文件夹 xff0c 选择add to libraries 等方法没有作用 后来去查看
  • tomcat启动报错:java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.Lifec

    tomcat启动报错 xff1a java lang IllegalStateException ContainerBase addChild start org apache catalina Lifec 百度的结果一般都是让修改web
  • UE4 音乐的播放与停止--基于蓝图

    要实现的功能非常简单 xff1a 点击按钮 xff0c 播放音乐 这个功能非常基础 xff0c 就两步 xff1a 1 将音乐源文件拖到context文件夹中 注意 xff0c 这里的音乐文件必须是 wav格式的 2 在按钮的onclick
  • UnityEditor.BuildPlayerWindow+BuildMethodException

    unity3D安卓打包报错 xff1a UnityEditor BuildPlayerWindow 43 BuildMethodException 61 errors at UnityEditor BuildPlayerWindow 43
  • Spark常用API<Scala>

    概览 1 转换 2 动作1 Transformation 1 1一个RDD进行转换操作1 2 两个RDD的转换操作1 3对一个Pair RDD进行转化操作1 4对两个PairRDD进行转换操作2 Action 2 1对一个RDD进行行动操作
  • 关于特定网页打不开问题的解决

    如果有一些特定的网站打不开 排除被屏蔽的可能性的话 xff0c 试着把DNS设置成了自动获取ip试试看 我就这样子解决了打不开学校官网的问题
  • 渲染业务领域全景图

    最近图形学应用领域愈发广泛 xff0c 根据我的理解 xff0c 制作了一张渲染相关业务全景图 xff0c 希望对大家的职业规划有一定帮助
  • AI 入门怎么学?这份学习指南请收好!

    万事开头难 xff01 AI 入门对很多初学 AI 的同学来说是一大难题 搜集了一大堆入门资料 xff0c Python 数学 深度学习应有尽有 xff0c 但就是无从下手 xff0c 总是在第一章与放弃之间徘徊 那么 xff0c AI 应
  • FTP如何设置用户名密码

    1 新建FTP站点 xff0c 指定名称和物理路径 2 身份验证 选择 基本 xff0c 允许访问 选择 指定用户 xff0c 下面文本框中输入 本地用户和组 中现有的一个用户名即可 注意 xff1a 只能是 本地用户和组 中的用户 xff
  • Android布局 -- Navigation实现底部导航栏

    底部导航栏加页卡的切换 xff0c 很多App采用这种布局设计 xff0c 在以前的开发中 xff0c 需要自定义底部导航栏以及使用FragmentTransaction来管理Fragment的切换 xff0c 代码量较大 xff0c 而使
  • ViewModelProviders is deprecated

    原有的创建ViewModel的方法 xff1a viewModel 61 ViewModelProviders of this get ViewModel class 提示ViewModelProviders过时 改为 xff1a view
  • Android Fragment退出 返回上一个Fragment与直接退出

    例如应用底部有两个导航按钮A与B xff0c 刚进入的时候显示为第一个AFragment xff0c 点击B切换到BFragment 如果需求是在BFragment点击返回键回到AFragment xff0c 需要配置 app defaul

随机推荐

  • Android基础 -- 子线程可以修改UI吗?

    子线程可以修改UI吗 xff1f 为什么会产生这样的问题 xff0c 可能是因为在开发过程中遇到了 34 Only the original thread that created a view hierarchy can touch it
  • leetcode 417. 太平洋大西洋水流问题

    https leetcode cn com problems pacific atlantic water flow 思路是从海洋开始逆流 如果可以逆流到 就标记为1 然后检查两个海洋都可以逆流到的区域 DFS public List lt
  • Android模拟器检测常用方法

    在Android开发过程中 xff0c 防作弊一直是老生常谈的问题 xff0c 而模拟器的检测往往是防作弊中的重要一环 xff0c 接下来有关于模拟器的检测方法 xff0c 和大家进行一个简单的分享 1 传统的检测方法 传统的检测方法主要是
  • RecyclerView 隐藏部分分割线

    在项目中遇到复杂点的RecyclerView xff0c 可能会有隐藏部分分割线的需求 xff0c 例如item1和item3之间的分割线隐藏 xff0c item4和item5之间的分割线隐藏等 在看了文档里的ItemDecoration
  • 浅谈去中心化应用

    1 中心化应用 现在我们所使用的应用基本上都是中心化的应用 xff0c 什么是中心化应用呢 xff0c 举个栗子 xff0c 我们在天猫买东西的时候 xff0c 需要先付款给支付宝 xff0c 然后卖家发货 xff0c 我们确认收货之后 x
  • EGL综述

    参考 xff1a https www khronos org registry EGL specs eglspec 1 5 pdf 什么是EGL EGL是支持多平台 多操作系统的 xff0c 比如安卓 Unix Windows等 为了扩展性
  • Java二分搜索树及其添加删除遍历

    对于树这种结构 xff0c 相信大家一定耳熟能详 xff0c 二叉树 二分搜索树 AVL树 红黑树 线段树 Trie等等 xff0c 但是对于树的应用以及编写一棵解决特定问题的树 xff0c 不少同学都会觉得不是一件简单的事情 xff0c
  • Android自定RadioGroup实现点击切换效果

    一 xff1a java文件 public class SegmentedGroup extends RadioGroup private int mMarginDp private Resources resources private
  • opencv--将本地摄像头数据转换成ip摄像头数据流,并在客户端获取该流进行显示

    项目介绍 xff1a 在本项目中 xff0c 实现从本地摄像头获取数据帧 xff0c 然后将其转换成ip摄像头数据流并在客户端通过opencv代码实时获取该图像数据进行显示 xff1a 当然也能在浏览器通过输入地址进行视频的访问 方式一 x
  • 8. &amp;和&amp;&amp;的区别?

    答 xff1a amp 运算符有两种用法 xff1a 1 按位与 xff1b 2 逻辑与 amp amp 运算符是短路与运算 逻辑与跟短路与的差别是非常巨大的 xff0c 虽然二者都要求运算符左右两端的布尔值都是true整个表达式的值才是t
  • 记InheritedWidget使用思考

    InheritedWidget 是项目中必不可少的组件 xff0c 用户数据共享 老生常谈的Provider框架也是基于InheritedWidget实现的 简介 InheritedWidget组件是功能性组局 xff0c 实现了由上向下共
  • flutter数据共享系列——随记

    Provider InheritedWidget 解决了数据共享问题 迎面也带来数据刷新导致的组件不必要更新问题 Provider基于InheritedWidget实现数据共享 xff0c 数据更新 xff0c 定向通知组件更新等 接下来我
  • Flutter布局——一段代码解释最常见的约束错误

    flutter布局的原理 Constraints go down Sizes go up Parent sets position 父节点向子节点传约束子节点向父节点上传大小最后由父节点决定位置 不是按照直接约束显示 问题代码 xff1a
  • 流媒体压力测试rtmp&hls(含推流和拉流)

    root 64 localhost yum install git unzip patch gcc gcc c 43 43 make root 64 localhost git clone https github com rzrobert
  • Windows开启网络对时方法

    Windows开启网络对时方法 1 启用 NTPServer 为此 xff0c 请按照下列步骤操作 xff1a a 单击 开始 xff0c 单击 运行 xff0c 键入 regedit xff0c 然后单击 确定 进入注册表 b 找到并单击
  • 关于【finder不能完成该操作 因为未能读取或写入"文件名"中的某些数据(错误代码-36)】快速解决办法

    如题 xff1a finder不能完成该操作 因为未能读取或写入 34 文件名 34 中的某些数据 错误代码 36 我们在Mac上操作NTFS格式的硬盘中的文件 xff0c 删除过程中由于某些原因为删除完整 xff0c 直接拔掉硬盘 xff
  • Ubuntu安装指定版本clang-format

    执行以下命令即可 xff1a wget O https apt llvm org llvm snapshot gpg key sudo apt key add sudo vim etc apt sources list 插入从https a
  • Swift中设置tableview的分割线(separator)的样式、颜色、边距

    Swift中设置tableview的分割线 xff08 separator xff09 的样式 颜色 边距 设置分割线样式 三种分割线样式 xff1a case None 无分割线 case SingleLine 单条分割线 case Si
  • React-Native 程序出现闪退原因之一

    React Native 程序出现闪退原因之一 1 RN的iOS端release版本和staging版本出现闪退 原因 xff1a 使用了Number isInteger 该方法在iOS端debug模式下运行不会出现异常 xff0c 一旦生
  • 【Android】【问题分析】G-sensor因数据交互问题导致手机crash

    G sensor因数据交互问题导致手机crash 问题现象 xff1a 测试同事发现 xff0c 手机在使用和待机时 xff0c 低概率发现手机会crash 问题原因 xff1a G sensor在driver和HAL层因交互的参数不匹配