`
runfeel
  • 浏览: 936264 次
文章分类
社区版块
存档分类
最新评论

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-studio-ide-193.6514223-windows,完整版下载

    《Android Studio 完整版在Windows平台上的安装与使用指南》 Android Studio是Google为Android开发者推出的集成开发环境(IDE),版本号193.6514223是其一个重要的里程碑,专为Windows操作系统设计。这个版本带来了...

    android-async-http的jar包

    例如,早期版本可能解决了一些已知问题,而后期版本则可能添加了对新API或网络协议的支持。选择合适的版本取决于你的项目需求和兼容性考虑。 Android-Async-Http库的核心特性包括: 1. **异步网络请求**:通过使用...

    bugreport-venus-TKQ1.220829.002-2024-04-18-00-45-35.zip

    《Android系统调试与Bug报告详解》 在移动设备开发领域,Android系统因其开源特性而备受开发者青睐。然而,系统的复杂性使得在开发和维护过程中,遇到问题时的调试显得尤为重要。"bugreport-venus-TKQ1.220829.002-...

    android-sdk-build-tools29.0.1.rar

    《Android SDK Build-Tools 29.0.1:构建工具的详解与应用》 在Android开发领域,Android SDK Build-Tools是不可或缺的一部分,它包含了用于构建Android应用程序的各种工具。本文将深入探讨Android SDK Build-Tools...

    Android代码-Chess Clock App

    Useful in blitz chess games and bug-house. License: Unless specified otherwise, this application is under the MIT license. The exceptions include the Android Wheel Control, which is under the Apache ...

    ksoap2-android-assembly-2.6.0-jar-with-dependencies.rar

    《ksoap2-android-assembly-2.6.0-jar-with-dependencies:Android调用Web服务接口的关键库》 在Android应用开发中,有时我们需要与远程服务器进行数据交互,这时Web服务接口就起到了桥梁的作用。ksoap2-android-...

    course-automated-testing-for-android-app-源码.rar

    "course-automated-testing-for-android-app-源码.rar" 是一个针对Android应用自动化测试的课程源码包,通过分析这个源码,我们可以深入理解Android自动化测试的各种技术和策略。 首先,我们要了解自动化测试的基本...

    内含各个版本的android-support-design包

    - 是否存在已知的兼容性问题或已修复的bug。 **集成到项目** 将Design Support Library集成到Android项目中,一般需要在`build.gradle`文件中添加依赖项,然后同步项目。例如,要添加特定版本的库,可以写入以下...

    NDK工具android-ndk-r10e-linux-x86_64

    NDK(Native Development Kit)是Android开发中的一个重要工具集,主要用作开发原生代码,如C和C++,以实现高性能、低级系统访问的应用程序。标题中的"android-ndk-r10e-linux-x86_64"表明这是一个特定版本的NDK,即...

    Android--虎扑体育App

    【Android--虎扑体育App】是一款基于Android平台的体育资讯应用,它采用了现代Android开发中的主流技术栈,包括Dagger2、RxJava和Retrofit,同时遵循MVP(Model-View-Presenter)设计模式,为用户提供流畅且丰富的...

    android-support-v4

    1. **Android Support Library**: Android Support Library是一系列API,用于解决向后兼容问题,确保开发者可以使用最新API而不会失去对旧设备的支持。"v4"表示这个库的目标是支持Android API Level 4(即Android ...

    最新版android-support-v4.jar

    Android Support Library v4的主要目标是解决Android平台碎片化的问题。由于Android系统的版本更新速度较快,不同设备可能运行着不同的系统版本,v4库确保开发者能使用最新的API特性,同时支持Android 2.1(API级别7...

    android-sdk-build-tools27.0.0.rar

    《Android SDK Build-Tools 27.0.0:构建工具的详解与应用》 在Android开发领域,Android SDK Build-Tools是不可或缺的一部分,它包含了用于构建Android应用程序的各种工具。本篇文章将深入探讨Android SDK Build-...

    安卓Android源码——oschina-android-app(开源中国).zip

    【标题】"安卓Android源码——oschina-android-app(开源中国).zip" 提供的是开源中国客户端应用的源代码,这为我们深入了解安卓应用程序的开发提供了宝贵的资源。开源中国作为一个国内知名的开源技术社区,其...

    Android SDK Platform-tools 26.0.2版本

    在26.0.2版本中,ADB可能已经包含了对当时Android系统的优化和bug修复。 2. **Fastboot**:Fastboot是一种低级别的恢复模式,用于更新固件分区,如系统、恢复、bootloader等。它在设备启动过程中执行,通常用于刷入...

    buglife-android,可怕的移动错误报告!.zip

    【buglife-android】是一款专为Android应用程序设计的开源错误报告SDK和Web平台,它致力于帮助开发者更有效地捕获、管理和解决应用中的错误。这个压缩包文件`buglife-android-master`很可能是该SDK的源代码仓库,...

    android-battery-historian.zip

    Battery Historian是由Google开发的一款用于分析Android设备电池日志的工具,主要通过解析bugreport文件,展示设备的电量消耗、性能状况和系统行为等信息。通过这个工具,我们可以深入理解设备在不同场景下的电池...

    Android-Buglife一个用于iOSApp的Bug报告SDK和Web平台

    对于Android开发,尽管标题提及的是iOS App,但标签中提到了"Android开发-其它杂项",这可能意味着Buglife也提供对Android的支持或有相关的解决方案。尽管Android版本的SDK不在提供的文件列表中,但通常类似的SDK会...

    bugreport-mars-RKQ1.201112.002-2023-10-03-12-09-27.zip

    在Android系统开发和维护中,bugreport是一个至关重要的工具,它能收集设备上的各种信息,帮助开发者定位和解决问题。这份名为"bugreport-mars-RKQ1.201112.002-2023-10-03-12-09-27.zip"的压缩包,显然包含了与...

    com.guo.android_extend:android-extend:1.0.6

    3. 发现特定版本的库存在已知的 bug 或兼容性问题,而本地的 `.aar` 文件已经修复了这些问题。 4. 为了减少构建时间,避免每次都从远程仓库下载。 使用 `.aar` 文件的步骤通常是: 1. 将 `android-extend-release....

Global site tag (gtag.js) - Google Analytics