1. 程式人生 > >ANR問題分析指北

ANR問題分析指北

  開啟dropbox中對應的system_app_anrxxxx:
     檢視主執行緒的棧:
  "main" prio=5 tid=1 Native
  | group="main" sCount=1 dsCount=0 obj=0x752b0000 self=0xb4276500
  | sysTid=25390 nice=-1 cgrp=default sched=3/0 handle=0xb6f18b34
  | state=S schedstat=( 0 0 0 ) utm=81 stm=12 core=2 HZ=100
  | stack=0xbe78b000-0xbe78d000 stackSize=8MB
  | held mutexes=
  kernel: (couldn't read /proc/self/task/25390/stack)
  native: #00 pc 000422d0  /system/lib/libc.so (__ioctl+8)
  native: #01 pc 00047825  /system/lib/libc.so (ioctl+14)
  native: #02 pc 0001e835  /system/lib/libbinder.so (_ZN7android14IPCThreadState14talkWithDriverEb+132)
  native: #03 pc 0001ee93  /system/lib/libbinder.so (_ZN7android14IPCThreadState15waitForResponseEPNS_6ParcelEPi+38)
  native: #04 pc 0001f049  /system/lib/libbinder.so (_ZN7android14IPCThreadState8transactEijRKNS_6ParcelEPS1_j+124)
  native: #05 pc 00019fe3  /system/lib/libbinder.so (_ZN7android8BpBinder8transactEjRKNS_6ParcelEPS1_j+30)
  native: #06 pc 0008a035  /system/lib/libandroid_runtime.so (???)
  native: #07 pc 00d78869  /data/dalvik-cache/arm/
[email protected]
@boot.oat (Java_android_os_BinderProxy_transactNative__ILandroid_os_Parcel_2Landroid_os_Parcel_2I+140) at android.os.BinderProxy.transactNative(Native method) at android.os.BinderProxy.transact(Binder.java:510) at android.os.storage.IMountService$Stub$Proxy.getVolumeList(IMountService.java:771) at android.os.storage.StorageManager.getVolumeList(StorageManager.java:883) at android.os.Environment$UserEnvironment.getExternalDirs(Environment.java:95) at android.os.Environment.getExternalStorageDirectory(Environment.java:354) at com.huawei.common.utils.PathUtils.<clinit>(PathUtils.java:51) at com.huawei.common.utils.PathUtils.getWorkspacePath(PathUtils.java:80) at com.huawei.common.components.log.Logger.<clinit>(Logger.java:37) at com.huawei.common.components.log.Logger.i(Logger.java:162) at com.huawei.hwvplayer.data.db.DbProvider.attachInfo(DbProvider.java:89) at android.app.ActivityThread.installProvider(ActivityThread.java:5279) at android.app.ActivityThread.installContentProviders(ActivityThread.java:4868) at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4799) at android.app.ActivityThread.access$1600(ActivityThread.java:165) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1436) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:188) at android.app.ActivityThread.main(ActivityThread.java:5578) at java.lang.reflect.Method.invoke!(Native method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:794) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:684) 主執行緒嘗試去呼叫MountService的 getVolumeList介面,可能沒有返回。 檢視system_server中相關的,搜尋getVolumeList 發現systemserver中有三個Binder執行緒和主執行緒被block,我們的對端是哪個Binder執行緒暫時無法確認,但這並不影響我們繼續分析,因為他們被blockd的路徑是一致的: "main" prio=5 tid=1 Blocked | group="main" sCount=1 dsCount=0 obj=0x752b0000 self=0xb4276500 | sysTid=22735 nice=-2 cgrp=default sched=0/0 handle=0xb6f18b34 | state=S schedstat=( 0 0 0 ) utm=432 stm=85 core=1 HZ=100 | stack=0xbe78b000-0xbe78d000 stackSize=8MB | held mutexes= at com.android.server.MountService.getVolumeList(MountService.java:2759) - waiting to lock <0x0eeb54f1> (a java.lang.Object) held by thread 40 at android.os.storage.StorageManager.getVolumeList(StorageManager.java:883) at android.os.storage.StorageManager.getVolumeList(StorageManager.java:858) at android.os.storage.StorageManager.getPrimaryVolume(StorageManager.java:906) at com.android.server.usb.UsbDeviceManager.systemReady(UsbDeviceManager.java:327) at com.android.server.usb.UsbService.systemReady(UsbService.java:181) at com.android.server.usb.UsbService$Lifecycle.onBootPhase(UsbService.java:78) at com.android.server.SystemServiceManager.startBootPhase(SystemServiceManager.java:135) at com.android.server.SystemServer$3.run(SystemServer.java:1489) at com.android.server.am.ActivityManagerService.systemReady(ActivityManagerService.java:12417) at com.android.server.am.HwActivityManagerService.systemReady(HwActivityManagerService.java:960) at com.android.server.SystemServer.startOtherServices(SystemServer.java:1485) at com.android.server.SystemServer.run(SystemServer.java:381) at com.android.server.SystemServer.main(SystemServer.java:272) at java.lang.reflect.Method.invoke!(Native method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:794) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:684) "Binder_8" prio=5 tid=76 Blocked | group="main" sCount=1 dsCount=0 obj=0x13bd60a0 self=0x9c1abe00 | sysTid=25191 nice=-1 cgrp=default sched=0/0 handle=0x97158930 | state=S schedstat=( 0 0 0 ) utm=9 stm=7 core=2 HZ=100 | stack=0x9705c000-0x9705e000 stackSize=1014KB | held mutexes= at com.android.server.MountService.getVolumeList(MountService.java:2759) - waiting to lock <0x0eeb54f1> (a java.lang.Object) held by thread 40 at android.os.storage.IMountService$Stub.onTransact(IMountService.java:1634) at android.os.Binder.execTransact(Binder.java:453) "Binder_2" prio=5 tid=8 Blocked | group="main" sCount=1 dsCount=0 obj=0x12cac0a0 self=0xaebf0300 | sysTid=22761 nice=-1 cgrp=default sched=0/0 handle=0xaef7d930 | state=S schedstat=( 0 0 0 ) utm=41 stm=25 core=0 HZ=100 | stack=0xaee81000-0xaee83000 stackSize=1014KB | held mutexes= at com.android.server.MountService.getVolumeList(MountService.java:2759) - waiting to lock <0x0eeb54f1> (a java.lang.Object) held by thread 40 at android.os.storage.IMountService$Stub.onTransact(IMountService.java:1634) at android.os.Binder.execTransact(Binder.java:453) 他們均是被tid=40的人block,按照上面的方法搜尋tid=40或者 0x0eeb54f1得到block的人: "MountService" prio=5 tid=40 TimedWaiting | group="main" sCount=1 dsCount=0 obj=0x132c1160 self=0x9ce57400 | sysTid=23512 nice=0 cgrp=default sched=0/0 handle=0x9a239930 | state=S schedstat=( 0 0 0 ) utm=29 stm=2 core=2 HZ=100 | stack=0x9a137000-0x9a139000 stackSize=1038KB | held mutexes= at java.lang.Object.wait!(Native method) - waiting on <0x00fea1f3> (a java.lang.Object) at java.lang.Thread.parkFor$(Thread.java:1235) - locked <0x00fea1f3> (a java.lang.Object) at sun.misc.Unsafe.park(Unsafe.java:299) at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:198) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2053) at java.util.concurrent.ArrayBlockingQueue.poll(ArrayBlockingQueue.java:372) at com.android.server.NativeDaemonConnector$ResponseQueue.remove(NativeDaemonConnector.java:777) at com.android.server.NativeDaemonConnector.executeForList(NativeDaemonConnector.java:489) at com.android.server.NativeDaemonConnector.execute(NativeDaemonConnector.java:386) at com.android.server.NativeDaemonConnector.execute(NativeDaemonConnector.java:381) at com.android.server.MountService.resetIfReadyAndConnectedLocked(MountService.java:827) at com.android.server.MountService.handleSystemReady(MountService.java:776) - locked <0x0eeb54f1> (a java.lang.Object) at com.android.server.MountService.access$500(MountService.java:152) at com.android.server.MountService$MountServiceHandler.handleMessage(MountService.java:596) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:150) at android.os.HandlerThread.run(HandlerThread.java:61) 和上面netd類似的,mountservice也是通過ndc和vold通訊,這裡我們需要繼續檢視是否vold存在異常。 之前提到過,類似這種同步鎖block的,dvm_lock_sample一定會有列印,於是先去找eventslog,不過這個是華為的log,是沒有eventlog的。 而華為實現了一個blockMonitor的功能,和dvm_lock_sample類似,當某個操作特別耗時的時候,會將其打印出來: 在ANR的附近找到如下: 07-19 10:17:50.739 25271 25271 W BlockMonitor: The binder calling took 55209ms. 07-19 10:17:50.739 25271 25271 W BlockMonitor: android.os.BlockMonitor.checkBinderTime(BlockMonitor.java:141) 07-19 10:17:50.739 25271 25271 W BlockMonitor: android.os.BinderProxy.transact(Binder.java:511) 07-19 10:17:50.739 25271 25271 W BlockMonitor: android.os.storage.IMountService$Stub$Proxy.getVolumeList(IMountService.java:771) 07-19 10:17:50.739 25271 25271 W BlockMonitor: android.os.storage.StorageManager.getVolumeList(StorageManager.java:883) 07-19 10:17:50.739 25271 25271 W BlockMonitor: android.os.Environment$UserEnvironment.getExternalDirs(Environment.java:95) 07-19 10:17:50.739 25271 25271 W BlockMonitor: android.os.Environment.getExternalStorageDirectory(Environment.java:354) 07-19 10:17:50.739 25271 25271 W BlockMonitor: android.support.v4.content.FileProvider.parsePathStrategy(FileProvider.java:583) 07-19 10:17:50.739 25271 25271 W BlockMonitor: android.support.v4.content.FileProvider.getPathStrategy(FileProvider.java:534) 07-19 10:17:50.739 25271 25271 W BlockMonitor: android.support.v4.content.FileProvider.attachInfo(FileProvider.java:352) 07-19 10:17:50.739 25271 25271 W BlockMonitor: android.app.ActivityThread.installProvider(ActivityThread.java:5279) 07-19 10:17:50.739 25271 25271 W BlockMonitor: android.app.ActivityThread.installContentProviders(ActivityThread.java:4868) 07-19 10:17:50.739 25271 25271 W BlockMonitor: android.app.ActivityThread.handleBindApplication(ActivityThread.java:4799) 07-19 10:17:50.739 25271 25271 W BlockMonitor: android.app.ActivityThread.access$1600(ActivityThread.java:165) 07-19 10:17:50.739 25271 25271 W BlockMonitor: android.app.ActivityThread$H.handleMessage(ActivityThread.java:1436) 07-19 10:17:50.739 25271 25271 W BlockMonitor: android.os.Handler.dispatchMessage(Handler.java:102) 07-19 10:17:50.739 25271 25271 W BlockMonitor: android.os.Looper.loop(Looper.java:188) 07-19 10:17:50.739 25271 25271 W BlockMonitor: android.app.ActivityThread.main(ActivityThread.java:5578) 07-19 10:17:50.739 25271 25271 W BlockMonitor: java.lang.reflect.Method.invoke(Native Method) 07-19 10:17:50.739 25271 25271 W BlockMonitor: com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:794) 07-19 10:17:50.739 25271 25271 W BlockMonitor: com.android.internal.os.ZygoteInit.main(ZygoteInit.java:684) 再加上之前的: 07-19 10:17:50.729 22735 23512 E NativeDaemonConnector.ResponseQueue: Timeout waiting for response 07-19 10:17:50.729 22735 23512 E VoldConnector: timed-out waiting for response to 4 volume reset 07-19 10:17:50.729 22735 23512 E VoldConnector: timed-out waiting for response mOutputStream =
[email protected]
, mSocket = vold 07-19 10:17:50.731 22735 23512 W MountService: Failed to reset vold 07-19 10:17:50.731 22735 23512 W MountService: com.android.server.NativeDaemonTimeoutException: command '4 volume reset' failed with 'null' 07-19 10:17:50.731 22735 23512 W MountService: at com.android.server.NativeDaemonConnector.executeForList(NativeDaemonConnector.java:501) 07-19 10:17:50.731 22735 23512 W MountService: at com.android.server.NativeDaemonConnector.execute(NativeDaemonConnector.java:386) 07-19 10:17:50.731 22735 23512 W MountService: at com.android.server.NativeDaemonConnector.execute(NativeDaemonConnector.java:381) 07-19 10:17:50.731 22735 23512 W MountService: at com.android.server.MountService.resetIfReadyAndConnectedLocked(MountService.java:827) 07-19 10:17:50.731 22735 23512 W MountService: at com.android.server.MountService.handleSystemReady(MountService.java:776) 07-19 10:17:50.731 22735 23512 W MountService: at com.android.server.MountService.access$500(MountService.java:152) 07-19 10:17:50.731 22735 23512 W MountService: at com.android.server.MountService$MountServiceHandler.handleMessage(MountService.java:596) 07-19 10:17:50.731 22735 23512 W MountService: at android.os.Handler.dispatchMessage(Handler.java:102) 07-19 10:17:50.731 22735 23512 W MountService: at android.os.Looper.loop(Looper.java:150) 07-19 10:17:50.731 22735 23512 W MountService: at android.os.HandlerThread.run(HandlerThread.java:61) 我們有理由去推斷vold的狀態是不對的,但是又沒有vold的棧。 那麼全域性grep vold試試能不能找到線索,在kernellog中發現了vold的異常: 07-19 14:22:24.669 <3>[10772.492156] c0 Freezing of tasks failed after 20.008 seconds (1 tasks refusing to freeze, wq_busy=0): 07-19 14:22:24.669 <6>[10772.492217] c0 vold R running 0 224 1 0x00000001 07-19 14:22:24.669 <4>[10772.492278] c0 [<c05ebecc>] (__schedule+0x38c/0x5bc) from [<c05ea478>] (schedule_timeout+0x18/0x1e8) 07-19 14:22:24.669 <4>[10772.492309] c0 [<c05ea478>] (schedule_timeout+0x18/0x1e8) from [<c05eb90c>] (wait_for_common+0x11c/0x164) 07-19 14:22:24.669 <4>[10772.492309] c0 [<c05eb90c>] (wait_for_common+0x11c/0x164) from [<c03cd8c8>] (mmc_wait_for_req+0xb4/0xe4) 07-19 14:22:24.669 <4>[10772.492339] c0 [<c03cd8c8>] (mmc_wait_for_req+0xb4/0xe4) from [<c03cd95c>] (mmc_wait_for_cmd+0x64/0x74) 07-19 14:22:24.669 <4>[10772.492370] c0 [<c03cd95c>] (mmc_wait_for_cmd+0x64/0x74) from [<c03d41f0>] (mmc_send_status+0x6c/0x8c) 07-19 14:22:24.670 <4>[10772.492400] c0 [<c03d41f0>] (mmc_send_status+0x6c/0x8c) from [<c03d4504>] (sd_send_status+0x14/0x44) 07-19 14:22:24.670 <4>[10772.492431] c0 [<c03d4504>] (sd_send_status+0x14/0x44) from [<c03d491c>] (mmc_lock_unlock_by_buf+0xac/0x168) 07-19 14:22:24.670 <4>[10772.492431] c0 [<c03d491c>] (mmc_lock_unlock_by_buf+0xac/0x168) from [<c03dabd8>] (mmc_lockable_store+0x594/0x75c) 07-19 14:22:24.670 <4>[10772.492461] c0 [<c03dabd8>] (mmc_lockable_store+0x594/0x75c) from [<c029d560>] (dev_attr_store+0x18/0x24) 07-19 14:22:32.070 <4>[10772.492492] c0 [<c029d560>] (dev_attr_store+0x18/0x24) from [<c013b370>] (sysfs_write_file+0x104/0x148) 07-19 14:22:32.070 <4>[10772.492522] c0 [<c013b370>] (sysfs_write_file+0x104/0x148) from [<c00eabb4>] (vfs_write+0xd0/0x180) 07-19 14:22:32.070 <4>[10772.492553] c0 [<c00eabb4>] (vfs_write+0xd0/0x180) from [<c00eb070>] (SyS_write+0x38/0x68) 07-19 14:22:32.071 <4>[10772.492583] c0 [<c00eb070>] (SyS_write+0x38/0x68) from [<c000e840>] (ret_fast_syscall+0x0/0x30) vold一直在這個操作中沒有退出來,所以不能響應客戶端的請求,從而導致了ANR。 這個問題需要mmc的同事進一步去分析,目前懷疑是SD卡發生了錯誤。

相關推薦

ANR問題分析

開啟dropbox中對應的system_app_anrxxxx: 檢視主執行緒的棧: "main" prio=5 tid=1 Native | group="main" sCount=1 dsCount=0 obj=0x752b0000 self=0xb4276500 | sysT

Android 內存分析

但是 循環引用 util == 所有 自動 ace 引用計數 mps android 內存泄漏分析指北 簡單來說內存泄漏就是當對象不再被應用程序使用,但是垃圾回收器卻不能移除它們,因為它們正在被引用 java 垃圾回收介紹: Java 虛擬機運行所管理的內存包括以下幾個運行

Android 記憶體分析

android 記憶體洩漏分析指北 簡單來說記憶體洩漏就是當物件不再被應用程式使用,但是垃圾回收器卻不能移除它們,因為它們正在被引用 java 垃圾回收介紹: Java 虛擬機器執行所管理的記憶體包括以下幾個執行時的資料區域 如下圖: 程式計數器: 一塊比較小的記憶體區域,可以看作是當前執行緒所執行

演算法漫遊(第十一篇):歸併排序演算法描述、動圖演示、程式碼實現、過程分析、複雜度

一、歸併排序 歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法(Divide and Conquer)的一個非常典型的應用。將已有序的子序列合併,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。若將兩個有序表合併成一個有序表,稱為2-路歸併。 所謂“分&r

Python基礎

基礎 lis list 字符 blank int 編輯器使用 字節 什麽 編碼 Python的世界中內存中統一使用Unicode,使用時轉換為其他編碼,比如網頁/文檔編輯器 Python3中字符串類型 str 使用Unicode編碼,而I/O得到的是字節碼 byt

全棧

design tps 阿裏媽媽 post 阿裏 sin ava HR mark 敬送一些網站 百度FEXantDesign騰訊CDC美團技術團隊百度EFE騰訊ISUX阿裏ued騰訊mxd阿裏媽媽新浪UED騰訊CDC百度UED360-奇舞團騰訊-alloyteam攜程UED

android anr分析

感知 pda destroy waiting query kill 事件機制 卡住 targe 轉自:https://blog.csdn.net/fishmai/article/details/71077047 ANR簡介 ANR,是“Applic

Android ANR 分析 /data/anr/trace.txt 該文件記錄了產生ANR的函數堆棧可以幫助分析

threads closed 格式 activity andro mpstat 內存 進程 repeat Log 在android中的地位非常重要,要是作為一個android程序員不能過分析log這關,算是android沒有入門吧 。 下面我們就來說說如何處理log文件 。

NPM實用

comm ack 去除 href 必須 環境 usr clas table npm作為下載node附送的大禮包,大家一定不會陌生。 然而關於npm,估計大量的只是用到npm install XXX以及npm run XXX。 其實這裏邊還有很多有意思的命令&參數

WSGI及gunicorn(一)

pointer multiple pro 協議 一場 nic tip point ise 作為一個Python Web 開發工程師,pyg0每天都喜滋滋的寫著基於各種web框架的業務代碼。 突然有一天,技術老大過來跟pyg0說,嘿,我們要新上線一個服務,你來幫我部署一下吧。

WSGI及gunicorn(二)

lock on() import 環境 找到 FN response 並且 分析 pyg0已經大概了解了wsgi。現在他決定深入探索他們實際在生產環境裏用到的web 服務器 -gunicorn。 先來看看官網的介紹:Gunicorn 是一個運行在Unix上的python W

Android ANR分析實踐(一):北京×××搭建ANR是什麽、產生的原因及如何避免ANR

例如 三種 handler 線程處理 不足 線程阻塞 種類 工具 input 一、 什麽是北京×××搭建 dsluntan.com VX:17061863513ANR ANR,(Application Not Responding) 即應用程序無響應,在android應

【長期更新】邁向現代化的 .Net 配置

同時 lis isn 創建 ONBUILD 現實 入口 會有 hosting 1. 歡呼 .NET Standard 時代 我現在已不大提 .Net Core,對於我來說,未來的開發將是基於 .NET Standard,不僅僅是 面向未來 ,也是 面向過去;不只是 .Net

Android ANR 分析

dal http 但是 tin 輸入 暫停 initial cmd 找到 ANR``Application Not Responding。在Android中,如果一些耗時操作造成主線程阻塞了一定時間,則系統會顯示ANR提示用戶此應用處於未響應的狀態。 ANR ANR出現的原

Javascript 模塊化

iot func mod 性能 內存占用 res window return 二分 前言 隨著 Web 技術的蓬勃發展和依賴的基礎設施日益完善,前端領域逐漸從瀏覽器擴展至服務端(Node.js),桌面端(PC、Android、iOS),乃至於物聯網設備(IoT),其中 Ja

程式猿談薪

大家都知道,程式猿這個群體,特別easy出現同工不同酬的現象。非常多時候,我們通過了公司的層層篩選,然後和hr要了愜意的工資,興高採烈地去入職後,突然有一天通過小道訊息得知。某個同事級別和你一樣,可是工資比你多了幾千,預計你立刻開心不起來了。 事實上這是正常現象。這也是為什麼差

校園網使用-附一種免流量上網方法

    學校裡沒有集體寬頻,只能使用校園網(NEU),校園網資費政策如下: ①校園網訪問ipv6站點免費不限流量; ②校園網訪問ipv4站點20元每月60GB流量。(15元每月27GB流量)     除了國內高校的一些官網、直播站等支援ipv6

JavaScript 事件迴圈及非同步原理(完全

引言 最近面試被問到,JS 既然是單執行緒的,為什麼可以執行非同步操作? 當時腦子蒙了,思維一直被困在 單執行緒 這個問題上,一直在思考單執行緒為什麼可以額外執行任務,其實在我很早以前寫的部落格裡面有寫相關的內容,只不過時間太長給忘了,所以要經常溫習啊:(淺談 Generator 和 Promise

cocos2d 入門

cocos2d 入門指北 背景: 前一篇文章寫到關於SDK的一些工作。策劃的同事說要直接對接到 cocos2d,u3d。本文是對接cocos2d的過程的整理,當作給自己留的小筆記。 macOS Mojave cocos2d的官網在這裡,選擇其中的cocos2d-x 下載

js錯誤處理權威

By Lukas Gisder-Dubé | nov 14, 2018 原文 接著我上一篇文章,我想談談異常。我肯定你之前也聽過——異常是個好東西。一開始,我們害怕異常,畢竟寫bug容易被人噴。其實通過修bug,我們實際上學會了下次開發怎麼避免這個bug並且可以做得更好。 在生活中,我們常說吃一塹長一智