Android的BUG(四) - Android app的卡死问题
做android,免不了要去运行一些跑分程序,常用的跑分程序有quadrant(象限),nbench,安兔兔等。作为系统工程师,对这些跑分 程序都非常的不屑,这个只能是一个不客观的参考,但客户都喜欢拿这个比较,于是乎,各家各厂都或多或少会针对此做优化(甚至是作弊或直接的作假),这可不 是什么好现象,浮夸的厉害,到处放卫星,亩产万斤的,弄的我们这些老实人都很被动。不过这里就不说这些破事了。国内大家常用的跑分程序,就是安兔兔了,但 是不知道大家有没有发现,安兔兔跑起来后,有时会卡住不动,除了返回键和触摸操作都没什么用。
出现这一问题时,home键可以退出,继续运行其他应用,说明系统此时还是正常的。Top,vmstat看一下,也没有高CPU/IO占用率的进程,ps –t看一下,也没发现D状态的线程。不过,<span style="ps –t倒是发现了一个现象:
app_47 9691 8787 610076 28768 ffffffff 2aac4424 S com.antutu.ABenchMark
app_47 9706 9691 609060 24476 80061b00 2aac5434 S com.antutu.ABenchMark
出现了同名的进程!这很奇怪~
看这两个进程的父进程, 一个是zygote, 另外一个,则是com.antutu.ABenchMark自己。由此大约可以推断出来,后一个进程是前一个进程fork出来的,fork后还没来得及exec就卡住了。
接上adb,看下两个进程的状态吧:
Process: 9691
(gdb) bt
#0 read () at bionic/libc/arch-mips/syscalls/read.S:13
#1 0x2ad6d7d0 in executeProcess (env=0x1c7e60, javaCommands=0x2c118ab8, javaEnvironment=0x0, javaWorkingDirectory=0x0, inDescriptor=0x2c118af0, outDescriptor=0x2c118b00,
errDescriptor=0x2c118b10, redirectErrorStream=0 '\000') at libcore/luni/src/main/native/java_lang_ProcessManager.cpp:165
#2 ProcessManager_exec (env=0x1c7e60, javaCommands=0x2c118ab8, javaEnvironment=0x0, javaWorkingDirectory=0x0, inDescriptor=0x2c118af0, outDescriptor=0x2c118b00,
errDescriptor=0x2c118b10, redirectErrorStream=0 '\000') at libcore/luni/src/main/native/java_lang_ProcessManager.cpp:240
#3 0x2b8cccc4 in call_it () at external/libffi/src/mips/o32.S:145
#4 0x0026eb78 in ?? ()
没什么特别的,确实是卡在process的fork中。
再看看process 9706
(gdb) info thread
* 1 Thread 9706 __futex_syscall4 () at bionic/libc/arch-mips/bionic/atomics_mips.S:218
(gdb) bt
#0 __futex_syscall4 () at bionic/libc/arch-mips/bionic/atomics_mips.S:218
#1 0x2aabc288 in _normal_lock (mutex=0x2ab2142c) at bionic/libc/bionic/pthread.c:951
#2 pthread_mutex_lock (mutex=0x2ab2142c) at bionic/libc/bionic/pthread.c:1041
#3 0x2aabf848 in dlmalloc (bytes=4096) at bionic/libc/bionic/dlmalloc.c:4261
#4 0x2aace004 in __smakebuf (fp=0x2ab21598) at bionic/libc/stdio/makebuf.c:62
#5 0x2aad4658 in __swsetup (fp=0x2ab21598) at bionic/libc/stdio/wsetup.c:73
#6 0x2aace6a0 in putc_unlocked (c=48, fp=<value optimized out>) at bionic/libc/stdio/putc.c:46
#7 0x2aace744 in putc (c=48, fp=0x2ab21598) at bionic/libc/stdio/putc.c:64
#8 0x2aae44c0 in cpuacct_add (uid=<value optimized out>) at bionic/libc/bionic/cpuacct.c:55
#9 0x2aae57b0 in fork () at bionic/libc/bionic/fork.c:57
#10 0x2ad6d764 in executeProcess (env=0x1c7e60, javaCommands=0x2c118ab8, javaEnvironment=0x0, javaWorkingDirectory=0x0, inDescriptor=0x2c118af0, outDescriptor=0x2c118b00,
errDescriptor=0x2c118b10, redirectErrorStream=0 '\000') at libcore/luni/src/main/native/java_lang_ProcessManager.cpp:92
#11 ProcessManager_exec (env=0x1c7e60, javaCommands=0x2c118ab8, javaEnvironment=0x0, javaWorkingDirectory=0x0, inDescriptor=0x2c118af0, outDescriptor=0x2c118b00,
errDescriptor=0x2c118b10, redirectErrorStream=0 '\000') at libcore/luni/src/main/native/java_lang_ProcessManager.cpp:240
#12 0x2b8cccc4 in call_it () at external/libffi/src/mips/o32.S:145
#13 0x0026eb78 in ?? ()
(gdb)
可以看到停在bionic的fork中了,具体函数是: cpuacct_add(getuid()); 中的fprintf。 错误原因从bt上看得到,又是锁的问题。
这个问题找到原因后,解决方法倒是没有花什么精力,直接google一下,问题和解决方法都出来了:
https://code.google.com/p/android/issues/detail?id=19916
Comment 1 by gabrb...@gmail.com, Nov 23, 2011
This issue has also been found on ICS. cpuacct_add should not be doing anything that calls malloc() or free(). Proposed fixes are here:
http://review.omapzoom.org/16579
http://review.omapzoom.org/16573
现在越来越多的apk,会偷偷的fork进程,执行系统中的命令或dump调试信息,甚至如skype,会一下fork很多自己写的native服务,看着总归不是很爽。
版权声明:本文为博主原创文章,未经博主允许不得转载。
Android的BUG(四) - Android app的卡死问题的更多相关文章
- Android进阶(十四)Android Adapter详解
Android Adapter详解 Android是完全遵循MVC模式设计的框架,Activity是Controller,layout是View.因为layout五花八门,很多数据都不能直接绑定上去, ...
- Android特效专辑(四)——APP主页框架TabHost绑定ViewPager的替换者TabLayout
Android特效专辑(四)--APP主页框架TabHost绑定ViewPager的替换者TabLayout 现在很多app都在追求简单明了,功能又要强大,不过我还是喜欢之前的app风格,就是TabH ...
- 深度学习应用系列(四)| 使用 TFLite Android构建自己的图像识别App
深度学习要想落地实践,一个少不了的路径即是朝着智能终端.嵌入式设备等方向发展.但终端设备没有GPU服务器那样的强大性能,那如何使得终端设备应用上深度学习呢? 所幸谷歌已经推出了TFMobile,去年又 ...
- Android官方文档翻译 四 1.2Running Your App
Running Your App If you followed the previous lesson to create an Android project, it includes a def ...
- 20172328《程序设计与数据结构》实验四 Android程序设计报告
20172328<程序设计与数据结构>实验四 Android程序设计报告 课程:<程序设计与数据结构> 班级: 1723 姓名: 李馨雨 学号:20172328 实验教师:王志 ...
- Android Fragment使用(四) Toolbar使用及Fragment中的Toolbar处理
Toolbar作为ActionBar使用介绍 本文介绍了在Android中将Toolbar作为ActionBar使用的方法. 并且介绍了在Fragment和嵌套Fragment中使用Toolbar作为 ...
- Android入门(十四)内容提供器-实现跨程序共享实例
原文链接:http://www.orlion.ga/661/ 打开SQLite博文中创建的 DatabaseDemo项目,首先将 MyDatabaseHelper中使用 Toast弹出创建数据库成功的 ...
- 五、Android学习第四天补充——Android的常用控件(转)
(转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 五.Android学习第四天补充——Android的常用控件 熟悉常用的A ...
- Android按钮的四种点击事件
本文记录一下按钮的四种点击事件 第一种 public class MainActivity extends Activity { @Override protected void onCreate(B ...
- 20145208 实验四 Android开发基础
20145208 实验四 Android开发基础 安装Android Studio 安装的具体步骤在老师的链接中已经很详细了,在此就不做赘述了. 在此提出我觉得安装的时候需要注意的两个地方 一是安装地 ...
随机推荐
- linux网络相关命令使用
A,iptables使用示例 1,将请求80端口的包发送给本机8180端口(这样,别的机器访问本机的80端口时会被转发到8180端口去) iptables -t nat -A PREROUTING - ...
- sqlite性能简单測试
主要測试sqlite在大数据量下的插入及查询性能: 測试环境:Centos6.4 1G内存 单核 数据量 大小 索引字段检索(耗时) 非索引字段检索(耗时) 总插入时间 10W 19M 0.001 ...
- x0vncserver Fatal server error: no screens found
I make a connection through SSH and then I type: # x0vncserver --PasswordFile=/home/hello/.vnc/pass ...
- iOS获取运营商信号强度
此API是apple私有API,所以只可运用在越狱设备中,如果提交appstore,会遭遇apple的拒绝上架反馈! #import <dlfcn.h> int getSignalLeve ...
- Thread interrupt方法解析
初步理解 我们在看一些多线程代码的时候,有的时候会碰到使用interrupt()方法的时候.从字面的意思来理解,应该就是中断当前正在执行的线程.那么,对于一个我们设计的普通线程来说,如果我们在主线程里 ...
- python3.4.3如何获取文件的路径
#coding:utf-8from tkinter import *from tkinter import filedialogroot = Tk()root.filename = filedialo ...
- 如何正确的在java web配置数据池
在tomcat context.xml中配置数据 <Context reloadable="true"> <!-- Default set of monitore ...
- js中的一元运算符
一元运算符只有一个参数,即要操作的对象或值.它们是 ECMAScript 中最简单的运算符. delete delete 运算符删除对以前定义的对象属性或方法的引用.例如: var o = new O ...
- jqGrid一些操作
formatter:function(cellvalue,options,rowObject){} 在格式化行的时候这三个参数 cellvalue行数, options配置信息, rowObject行 ...
- Spring Boot特性(转)
摘要: 1. SpringApplication SpringApplication 类是启动 Spring Boot 应用的入口类,你可以创建一个包含 main() 方法的类,来运行 SpringA ...