如何调试Android ANR?

2023-12-29

我的 Android 应用程序最近在 Google Play 控制台中收到了大量 ANR 报告。 由于这种情况是在我将 Google Analytics 添加到应用程序中时开始发生的,因此我强烈怀疑是 Analytics 造成的。

问题是我知道如何使用堆栈跟踪来调试崩溃。但我不确定如何调试 ANR。我猜想 ANR 意味着主线程在某处被阻塞。但如何知道哪里被堵住了呢?请参阅下面我最近收到的典型 ANR 之一。如何解释它并开始弄清楚应用程序挂在哪里?

PS:由于使用了 DexGuard 代码混淆器,堆栈中的一些类/方法看起来很奇怪。

ANR报告:

DALVIK THREADS:
(mutexes: tll=0 tsl=0 tscl=0 ghl=0 hwl=0 hwll=0)
"main" prio=5 tid=1 VMWAIT
| group="main" sCount=1 dsCount=0 obj=0x40022198 self=0xcec8
| sysTid=5001 nice=0 sched=0/0 cgrp=[fopen-error:2] handle=-1345006496
| schedstat=( 1265991222 1037628169 649 )
at dalvik.system.DexFile.openDexFile(Native Method)
at dalvik.system.DexFile.<init>(DexFile.java:103)
at dalvik.system.DexFile.loadDex(DexFile.java:142)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at o.Ə$鷭$囃.<clinit>((null):-1)
at o.Ə$櫯.onServiceConnected(:-1)
at android.app.LoadedApk$ServiceDispatcher.doConnected(LoadedApk.java:1064)
at android.app.LoadedApk$ServiceDispatcher$RunConnection.run(LoadedApk.java:1081)
at android.os.Handler.handleCallback(Handler.java:587)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3687)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
at dalvik.system.NativeStart.main(Native Method)

"Binder Thread #3" prio=5 tid=14 NATIVE
| group="main" sCount=1 dsCount=0 obj=0x40624cc0 self=0x27eeb0
| sysTid=5046 nice=0 sched=0/0 cgrp=[fopen-error:2] handle=2499688
| schedstat=( 946046 5981445 3 )
at dalvik.system.NativeStart.run(Native Method)

"Thread-15" prio=5 tid=13 TIMED_WAIT
| group="main" sCount=1 dsCount=0 obj=0x405e2a10 self=0x1c99e0
| sysTid=5020 nice=0 sched=0/0 cgrp=[fopen-error:2] handle=1845856
| schedstat=( 41442864 92254646 93 )
at java.lang.Object.wait(Native Method)
- waiting on <0x4050ddb0> (a o.㱽)
at java.lang.Object.wait(Object.java:395)
at o.㱽.run(:723)
at java.lang.Thread.run(Thread.java:1019)

"CookieSyncManager" prio=5 tid=12 NATIVE
| group="main" sCount=1 dsCount=0 obj=0x40575550 self=0x1ca5a0
| sysTid=5019 nice=10 sched=0/0 cgrp=[fopen-error:2] handle=1844760
| schedstat=( 793456 13153076 3 )
at android.os.MessageQueue.nativePollOnce(Native Method)
at android.os.MessageQueue.next(MessageQueue.java:119)
at android.os.Looper.loop(Looper.java:117)
at android.webkit.WebSyncManager.run(WebSyncManager.java:90)
at android.webkit.CookieSyncManager.run(CookieSyncManager.java:61)
at java.lang.Thread.run(Thread.java:1019)

"WebViewWorkerThread" prio=5 tid=11 NATIVE
| group="main" sCount=1 dsCount=0 obj=0x40572d28 self=0x1cec60
| sysTid=5017 nice=1 sched=0/0 cgrp=[fopen-error:2] handle=1904424
| schedstat=( 21575930 39001463 32 )
at android.os.MessageQueue.nativePollOnce(Native Method)
at android.os.MessageQueue.next(MessageQueue.java:119)
at android.os.Looper.loop(Looper.java:117)
at android.os.HandlerThread.run(HandlerThread.java:60)

"WebViewCoreThread" prio=5 tid=10 NATIVE
| group="main" sCount=1 dsCount=0 obj=0x405ded38 self=0x1c9300
| sysTid=5016 nice=0 sched=0/0 cgrp=[fopen-error:2] handle=1872952
| schedstat=( 205108647 198852533 140 )
at android.os.MessageQueue.nativePollOnce(Native Method)
at android.os.MessageQueue.next(MessageQueue.java:119)
at android.os.Looper.loop(Looper.java:117)
at android.webkit.WebViewCore$WebCoreThread.run(WebViewCore.java:685)
at java.lang.Thread.run(Thread.java:1019)

"pool-1-thread-1" prio=5 tid=9 WAIT
| group="main" sCount=1 dsCount=0 obj=0x4050daa0 self=0x1c05b8
| sysTid=5015 nice=0 sched=0/0 cgrp=[fopen-error:2] handle=1869904
| schedstat=( 5187987 16571046 6 )
at java.lang.Object.wait(Native Method)
- waiting on <0x4050dc68> (a java.lang.VMThread)
at java.lang.Thread.parkFor(Thread.java:1424)
at java.lang.LangAccessImpl.parkFor(LangAccessImpl.java:48)
at sun.misc.Unsafe.park(Unsafe.java:337)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:157)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2016)
at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:411)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1021)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1081)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
at java.lang.Thread.run(Thread.java:1019)

"GAThread" prio=5 tid=8 WAIT
| group="main" sCount=1 dsCount=0 obj=0x405a4518 self=0x1b8e58
| sysTid=5014 nice=0 sched=0/0 cgrp=[fopen-error:2] handle=1806224
| schedstat=( 288482667 146301269 277 )
at java.lang.Object.wait(Native Method)
- waiting on <0x405a4798> (a java.lang.VMThread)
at java.lang.Thread.parkFor(Thread.java:1424)
at java.lang.LangAccessImpl.parkFor(LangAccessImpl.java:48)
at sun.misc.Unsafe.park(Unsafe.java:337)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:157)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2016)
at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:411)
at o.뛖.run(:518)

"Binder Thread #2" prio=5 tid=7 NATIVE
| group="main" sCount=1 dsCount=0 obj=0x40516ed0 self=0xe4478
| sysTid=5007 nice=0 sched=0/0 cgrp=[fopen-error:2] handle=1390912
| schedstat=( 5340576 31036382 32 )
at dalvik.system.NativeStart.run(Native Method)

"Binder Thread #1" prio=5 tid=6 NATIVE
| group="main" sCount=1 dsCount=0 obj=0x40515cb0 self=0x1534c8
| sysTid=5006 nice=0 sched=0/0 cgrp=[fopen-error:2] handle=577280
| schedstat=( 10803221 33203131 35 )
at dalvik.system.NativeStart.run(Native Method)

"Compiler" daemon prio=5 tid=5 VMWAIT
| group="system" sCount=1 dsCount=0 obj=0x40511d80 self=0x8cce0
| sysTid=5005 nice=0 sched=0/0 cgrp=[fopen-error:2] handle=1146040
| schedstat=( 79406736 76446531 396 )
at dalvik.system.NativeStart.run(Native Method)

"Signal Catcher" daemon prio=5 tid=4 RUNNABLE
| group="system" sCount=0 dsCount=0 obj=0x40511cc0 self=0x117af8
| sysTid=5004 nice=0 sched=0/0 cgrp=[fopen-error:2] handle=1145528
| schedstat=( 23651123 21545411 7 )
at dalvik.system.NativeStart.run(Native Method)

"GC" daemon prio=5 tid=3 VMWAIT
| group="system" sCount=1 dsCount=0 obj=0x40511c18 self=0x153240
| sysTid=5003 nice=0 sched=0/0 cgrp=[fopen-error:2] handle=1389056
| schedstat=( 367523192 416046141 132 )
at dalvik.system.NativeStart.run(Native Method)

"HeapWorker" daemon prio=5 tid=2 VMWAIT
| group="system" sCount=1 dsCount=0 obj=0x40511b60 self=0xe6980
| sysTid=5002 nice=0 sched=0/0 cgrp=[fopen-error:2] handle=944960
| schedstat=( 52612306 103576660 48 )
at dalvik.system.NativeStart.run(Native Method)

但如何知道哪里被堵住了呢?

开始于使能StrictMode http://developer.android.com/reference/android/os/StrictMode.html并运行您的应用程序。如果您(或 Analytics)在主应用程序线程上执行磁盘或网络 I/O,您将​​根据您选择的惩罚方式(例如登录 LogCat)找到相关信息:

public void onCreate() {
     if (BuildConfig.DEBUG) {
         StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
                 .detectAll()
                 .penaltyLog()
                 .build());
     }

     super.onCreate();

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

如何调试Android ANR? 的相关文章

随机推荐

  • 在 Eclipse 下运行 JMH 基准测试

    我正在尝试在 Eclipse 下开始使用 JMH 我可以构建一个 jar 来从命令行执行 但也希望能够直接在 Eclipse 中运行它 以便于开发 目前我得到 java lang RuntimeException ERROR Unable
  • 意图附加未删除/替换

    我正在按按钮设置警报 警报是有意触发的 这个意图得到一个额外的 int 来传递给广播接收器 问题是意图的额外内容在第一个时设置一次 单击该按钮 并且在其他单击时不会发生变化 Intent intent new Intent A this B
  • 如何将字符串列表转换为int列表

    我在列表中有这个列表 a 1 2 3 4 1 2 3 4 1 2 3 4 但我需要它是整数 我不确定在哪里使用 int 将 str 更改为 int a 1 2 3 4 1 2 3 4 1 2 3 4 您可以使用嵌套列表理解 如下所示 a 1
  • 通过 Selenium 解码 facebook 上的类名

    我注意到 Facebook 有一些奇怪的类名 看起来是计算机生成的 我不知道这些类是否至少随着时间的推移保持不变 或者它们在某个时间间隔内发生变化 也许有这方面经验的人可以回答 我唯一能看到的是 当我退出 Chrome 并再次打开它时 它仍
  • 使用 DotNetOpenAuth 的两条腿 OAuth

    我已经阅读了两条腿的 OAuth 并了解其背后的原理 我的问题是特定于DotNetOpenAuth http dotnetopenauth net 8000 图书馆 是否有关于如何通过两条腿身份验证使用 DotNetOpenAuth 的示例
  • CORS - 它保护什么?

    I read https developer mozilla org en US docs Web HTTP Access control CORS https developer mozilla org en US docs Web HT
  • Drupal 6,视图 2:是否可以有一个仅适用于注册用户的过滤器?

    是否可以在 Drupal 6 视图中创建仅适用于注册用户的过滤器 对于我需要的一个过滤器 我使用用户投票 使用 Fivestar 和 VotingAPI 来了解他们的用户是否已经投票给该节点 并且当用户是匿名时 就像来自所有匿名用户的所有投
  • 我可以将 ARM 处理器配置为升序堆栈增长方向吗?

    这里有一个问题谈到堆栈增长方向 Michael Burr 回答说 在 ARM 处理器中 堆栈增长方向是可以配置的 即降序 正常行为 堆栈向内存中的零地址 较低地址 增长 或者升序 即堆栈向内存中的较高地址增长 大多数现代系统中堆栈增长的方向
  • Angular:根据服务方法调用设置路由

    我通过以下方式设置了路线配置 NgModule 我有一项服务 可以根据某些条件确定应向用户显示应用程序的哪些部分 我需要调用该服务并根据返回值设置路由 Problem 路由配置是在注释内设置的 我无法了解如何在此类设置中调用服务 更具体地说
  • 有没有办法防止 CALayer 阴影与相邻图层重叠?

    我有一个收藏CALayers 每个层都是同一父层的子层CALayer 并且每个都应用了阴影 这些层是动态定位的 而且层数很多 所以我无法提前预测它们将如何排列 如果这些层彼此相邻 足够近以至于它们几乎接触 则其中一层的阴影CALayers渲
  • SAPbobsCOM 类未注册

    我使用 asp net C 开发了一个 Web 应用程序来下在线订单 我的应用程序 在 SAP 服务器 Windows 2008 R2 上工作正常 但是当我将项目复制到本地计算机 运行 Windows 7 时 出现错误 看不到SAPbobs
  • 如何确定Python脚本运行的操作系统是否是类Unix操作系统?

    我正在尝试通过 Python 脚本确定操作系统是否基于 Unix 我可以想到两种方法来做到这一点 但它们都有缺点 检查是否platform system 在一个元组中 例如 Linux Darwin 问题是我不想提供每个制作的类 Unix
  • JBoss CLI 的特殊字符

    我使用 JBoss 6 4 8 版本处于域模式 我想通过 CLI 添加这 4 个系统属性 1 host myserver server config node system property javax net ssl keyStorePa
  • 许多列的数据表宽度溢出

    哇哦 我的 jquery 数据表插件有这个严重的问题 我有一个包含很多列 超过 35 列 的表 并且该表溢出了我的 div 内容 我尝试了很多方法 包括解决堆栈溢出中相同问题的方法 但仍然无法解决这个问题 所以 我真的需要你的帮助 谢谢你
  • 开始救援未捕获错误

    我正在使用一些包含在 begin rescue 块中的 ruby 代码 但不知何故它仍然崩溃 代码块如下所示 Retrieve messages from server def get messages connection select
  • Azure Pipeline - 使用 Azure Feed 进行 npm 安装错误 403

    我的 NPM 安装步骤配置为使用 npmrc 中的注册表 My npmrc is as follows registry https pkgs dev azure com xxx xxxx xxxx xxxx packaging desig
  • Parent TreeView Item鬼选事件!

    我有一个 TreeView 当引发每个 TreeViewItems Selected 事件时 它会启动一个新窗口
  • Erlang 代码来测量执行操作所花费的时间?

    有人能好心地向我指出一些 erlang 代码吗 它允许我计算运行某些代码片段需要多长时间 我还没有看到有可用的 erlang 库吗 您可以使用erlang statistics http www erlang org doc man erl
  • iOS 钥匙串偶尔会返回空字符串

    我编写了非常安全的应用程序 为银行 并将私钥保存在钥匙串中 我使用以下代码保留私钥 void savePrivatekey NSString Key KeychainItemWrapper keychain KeychainItemWrap
  • 如何调试Android ANR?

    我的 Android 应用程序最近在 Google Play 控制台中收到了大量 ANR 报告 由于这种情况是在我将 Google Analytics 添加到应用程序中时开始发生的 因此我强烈怀疑是 Analytics 造成的 问题是我知道