1、问题描述

不同类型测试均发生system_server native crash问题。

2、问题分析

log如下:

pid: 3421, tid: 3515, name:PowerManagerSer  >>>system_server <<<

signal 6 (SIGABRT), code -6 (SI_TKILL),fault addr --------

Abort message:'BitTube::recvObjects(count=256, size=104), res=18 (partial events werereceived!)'

rax 0000000000000000  rbx00007d0735ac94f8  rcx00007d074d9bfe97  rdx 0000000000000006

rsi 0000000000000dbb  rdi0000000000000d5d

r8  0000000000000030  r9 0000000000000069  r10 0000000000000008  r11 0000000000000202

r12 0000000000000dbb  r130000000000000006  r140000000000000000  r15 00007d072c28e640

cs  0000000000000033  ss 000000000000002b

rip 00007d074d9bfe97  rbp000000000000000b  rsp00007d0735ac7cc8  eflags 0000000000000202

backtrace:

#00 pc 000000000008ee97 /system/lib64/libc.so (tgkill+7)

#01 pc 000000000008b8b2 /system/lib64/libc.so (pthread_kill+66)

#02 pc 00000000000302d1 /system/lib64/libc.so (raise+17)

#03 pc 00000000000286be /system/lib64/libc.so (abort+78)

#04 pc 0000000000010f4f /system/lib64/libcutils.so (__android_log_assert+287)

#05 pc 0000000000064008 /system/lib64/libgui.so(_ZN7android7BitTube11recvObjectsERKNS_2spIS0_EEPvmm+264)

#06 pc 00000000000856c6 /system/lib64/libgui.so(_ZN7android16SensorEventQueue4readEP12ASensorEventm+54)

#07 pc 00000000001566e7 /system/lib64/libandroid_runtime.so

#08 pc 0000000000018b06 /system/lib64/libutils.so (_ZN7android6Looper9pollInnerEi+998)

#09 pc 000000000001865a /system/lib64/libutils.so (_ZN7android6Looper8pollOnceEiPiS1_PPv+42)

#10 pc 0000000000101126 /system/lib64/libandroid_runtime.so(_ZN7android18NativeMessageQueue8pollOnceEP7_JNIEnvP8_jobjecti+38)

#11 pc 0000000073fc48f8 /data/dalvik-cache/x86_64/system@framework@boot.oat (offset 0x2c0d000)

从调用栈分析是主动abort

168ssize_t BitTube::recvObjects(const sp<BitTube>& tube,

169        void* events, size_tcount, size_t objSize)

170{

171    char* vaddr =reinterpret_cast<char*>(events);

172    ssize_t size = tube->read(vaddr,count*objSize);//size = 18,objSize = 104,count = 256,count*objSize =26k

173

174    // should never happenbecause of SOCK_SEQPACKET

175    LOG_ALWAYS_FATAL_IF((size >= 0)&& (size % static_cast<ssize_t>(objSize)),//--》((size >=0) && (size % objSize)=1)不为0所以主动abort

176           "BitTube::recvObjects(count=%zu, size=%zu), res=%zd (partial eventswere received!)",

177            count, objSize, size);

178

180    return size < 0 ? size :size / static_cast<ssize_t>(objSize);

181}

ssize_t BitTube::read(void* vaddr, size_t size)

{

ssize_t err, len;

do {

len = ::recv(mReceiveFd,vaddr, size, MSG_DONTWAIT);//这里的size =26k

err = len < 0 ? errno :0;

} while (err == EINTR);//EINTR =4

if (err == EAGAIN || err ==EWOULDBLOCK) {//EAGAIN 11

// EAGAIN means that we havenon-blocking I/O but there was

// no data to be read.Nothing the client should care about.

return 0;

}

return err == 0 ? len :-err;//#define EXDEV 18--》Cross-device link

}

开始认为是read时底层出现异常返回EXDEV 18错误--》Cross-devicelink异常,跟踪分析当前read的对应的驱动sensorEvent,通过gdb分析coredump,read的 是距离感应sensor数据。

(gdb) f 8

#8  0x00007d074c0ec6e8 in (anonymousnamespace)::Receiver::handleEvent (this=0x7d072c364ec0,

fd=<optimized out>,events=<optimized out>, data=<optimized out>)

atframeworks/base/core/jni/android_hardware_SensorManager.cpp:294

294 frameworks/base/core/jni/android_hardware_SensorManager.cpp:No such file or directory.

ASensorEvent buffer[16];

(gdb) info locals

env = 0x7d07405918c0

q = {

m_ptr = 0x7d0743026d80

}

buffer = {{

version = 104, ---》sizeof(structASensorEvent)

sensor = 58,

type = 8, --------》SENSOR_TYPE_PROXIMITY(距离感应sensor)

reserved0 = 0,

timestamp = 13488767000000

结合kernellog和代码看距离感应sensor无异常,且模块驱动没有代码会返回EXDEV 18异常。

转而分析内存和read的地址,从代码看read地址是mRecBuffer转换的

ssize_t SensorEventQueue::read(ASensorEvent* events, size_t numEvents) {

if (mAvailable == 0) {

ssize_t err =BitTube::recvObjects(mSensorChannel,

mRecBuffer,MAX_RECEIVE_BUFFER_EVENT_COUNT);

ssize_t BitTube::recvObjects(const sp<BitTube>& tube,

void* events, size_t count,size_t objSize)

{

char* vaddr =reinterpret_cast<char*>(events);//--》mRecBuffer = 0x7d072b8bf840

ssize_t size =tube->read(vaddr, count*objSize);

LOG_ALWAYS_FATAL_IF((size >=0) && (size % static_cast<ssize_t>(objSize)),

"BitTube::recvObjects(count=%zu,size=%zu), res=%zd (partial events were received!)",

count, objSize, size);

}

(gdb) f 7

#7  android::SensorEventQueue::read(this=0x7d0743026d80, events=events@entry=0x7d0735ac8350,

numEvents=<optimized out>,numEvents@entry=16) at frameworks/native/libs/gui/SensorEventQueue.cpp:70

70  inframeworks/native/libs/gui/SensorEventQueue.cpp

(gdb) p /x *this->mRecBuffer

$4 = {//这里的值明显是异常值

version = 0x432b5441,

sensor = 0x3d4d5352,

type = 0x2c323931,

reserved0 = 0x33303231,

timestamp = 0xc44992a0d32,

{

{

data = {0x5, 0xe5, 0x66, 0x0<repeats 13 times>},

vector = {

{

v = {0x5, 0xe5, 0x66},

{

x = 0x5,

y = 0xe5,

z = 0x66

},

看内存mRecBuffer地址在堆上。

mRecBuffer =0x7d072b8bf840

7d072b800000-7d072ba00000rw-p 00000000 00:00 0                         [anon:libc_malloc]

读取mRecBuffer内容发现,内部是一个at命令相关的字符串,而当前读取的应该是距离感应的数据,不可能有这样的字串

(gdb) x /104s  0x7d072b8bf840

0x7d072b8bf840: "AT+CRSM=192,12032\r*\231D\f"

0x7d072b8bf857: ""

0x7d072b8bf858: ""

0x7d072b8bf859: ""

发现mRecBuffer被覆盖了

从代码中搜索“AT+CRSM“字串,发现有两个地方使用,一个是ril_sim.c,一个是liblcsagent.so库相关的代码中,ril_sim.c是rild模块代码不会跑在system_server中,后面liblcsagent.so这个库是gps的一个闭源库,是跑在system_server里面的。

这里重点就怀疑是liblcsagent.so这个库中的代码有问题。由于不开源,这里不贴相关代码。和模块同事沟通,这里代码是如何操作“AT+CRSM”。沟通后得知,模块会打开文件,写入AT+CRSM,之后关闭对应的文件。那这里为何会将AT+CRSM写入到sensorEvent中呢?看代码后明白了,首先gps和sensorService都跑在system_server中,当gps模块close了这个fd后,没有在关闭fd后对fd设置为初始值-1,且在close fd后没有检查fd的有效性的前提下又进行了使用,而这时这个fd的值在发生问题时,正好被分配给了SensorService的socket,就导致socket操作的fd和之前被关闭的fd在数值上是一样的,而gps这里操作这个fd,也就正好将”AT+CRSM“这样的数据写入了SensorEvent的socket中,而SensorService中的looper检测到socket的fd有写入数据,所以就去调用read操作,读取数据,但读出的数据并不是想要的sensor的数据,就发生了主动abort。导致system_server 发生crash。至此问题发生原因明确。

修改此问题比较简单,就是在close fd后给fd设置初值,同时在操作fd的地方对fd做检查,问题解决。

【野fd问题】野fd导致system_server发生crash问题相关推荐

  1. iOS 野指针定位:野指针嗅探器

    程序员大咖 点击右侧关注,免费进阶高级! 作者:林大鹏天地 链接:https://www.jianshu.com/p/9fd4dc046046 一. 前言 最近最近被指派去解决一些线上的崩溃问题,经常 ...

  2. 【泄漏类】android7.0 system_server发生global reference table overflow问题分析

    1.问题描述 旋转屏测试5-6小时system_server发生abort,手机重启导致测试停止,android7.0平台多个项目都有此问题爆出. 和测试同事了解旋转屏幕在settings界面进行操作 ...

  3. 【C 语言】指针数据类型 ( 野指针 | 避免野指针推荐方案 )

    文章目录 一.野指针 二.避免野指针推荐方案 一.野指针 参考 [C 语言]内存管理 ( 动态内存分配 | 栈 | 堆 | 静态存储区 | 内存布局 | 野指针 ) 四. 野指针 ( 程序BUG根源 ...

  4. 【CAN FD之CAN FD应用领域及CAN迁移至CAN FD的策略分析介绍】

    CAN FD适用领域 快速软件下载 CAN-FD 可以加速针对汽车 ECU 的最后编程工作.通用汽车指出,使用 CAN-FD 后, ECU 编程时间将缩短至当前编程时间的三分之一,甚至是五分之一.同样 ...

  5. 一只快乐的野指针_野酸枣

    闲暇时抬头张望时,山上的叶子黄了,火车路边的那几株野酸枣红了.国庆回家,我经不起那几株长在悬崖边野酸枣的诱惑,择了条小路,移动着臃肿的身躯,在荆棘丛生的荒坡上,在长满锋利的枣刺的树上,摘了一小篮子酸枣 ...

  6. 避免当野monkey, 走野路子

    一直都想写点"深"层次的东西,总停留在代码层面确实不够腕,当然啦,我也不是什么腕.^_^ 上面这些都可以当个笑话,但其实也是有一定意义的,最少细心的人会想到我要表达的思想:只停留在 ...

  7. openjdk7的ImageIO.read()导致jvm异常crash

    首先服务器用的是openjdk7,下面是读取图片的代码 public static JSONObject getPicDetail(String picPath) {JSONObject picObj ...

  8. Android Studio导致App出现crash的问题

    今天在用Android Studio调式代码的时候发生了一个很奇怪的crash问题,异常log如下: java.lang.ClassCastException: java.lang.ref.SoftR ...

  9. Android O发生crash,提示/system/bin/linker64(备忘)

    错误提示: 2010-01-01 08:24:29.913 20251-20251/com.anwsdk.service W/linker: library "libsqlite.so&qu ...

最新文章

  1. mysql修改字段为现在时间_mysql如何修改字段自动生成时间
  2. nuxt渲染html文件,Nuxt页面级缓存
  3. vue3绑定多个事件
  4. HDU 4868 Information Extraction(2014 多校联合第一场 H)
  5. stand up meeting 12/21/2015
  6. java设置框架位置_怎样设置label的位置啊?求指导
  7. excek快速删除指定行
  8. 近十年数据库流行趋势纵览!存储计算分离、ACID 全面回归......
  9. kali远程登录window_手把手教你配置VS Code远程开发工具,工作效率提升N倍
  10. 信息时代不被淘汰,获取成功需有的十种能力
  11. R语言绘图大小及图例问题
  12. 基于vue3.0全家桶H5模板
  13. Java当中native方法的详解
  14. 屏幕录制工具LICEcap,截屏生成GIF图
  15. 壮观性能服务器图片介绍,配至强7500 图解惠普ProLiant DL980 G7
  16. mac查找字符串并替换
  17. android临时文件夹,【报Bug】安卓端,保存视频到相册成功,临时文件夹中有,但是相册中没有...
  18. ICN: Integrated crosstalk noise
  19. Android历史版本
  20. mysql5.6只有解压缩_MySQL 5.6 for Windows 解压缩版配置安装

热门文章

  1. Intel因特尔 SSG大数据实习生面试
  2. 张一锋:法定数字货币是必然,但未必采用区块链技术,柬埔寨或发行加密货币 | 区块链日报
  3. Android采用AES+RSA的加密机制对http请求进行加密
  4. html怎么实现计算器功能键介绍,JavaScript实现网页计算器功能
  5. js获取当前年月日,格式(YYYY年mm月dd日)
  6. 区域法(zonal method)重构波前
  7. pygame 弹球游戏
  8. POI:从Excel文件中读取数据,向Excel文件中写入数据,将Excel表格中的数据插入数据库,将数据库中的数据添加到Excel表
  9. JAVA学习笔记_Junit测试简单使用_assertEquals
  10. springboot+mysql+基于vue焕心眼镜商城的设计与实现 毕业设计-附源码091546