WaitHoldingLocks 异常

问题描述 投票:0回答:1

[libart.so] art::ConditionVariable::WaitHoldingLocks

ANR triggered by thread waiting for a binder transaction     

 *emphasized text* "main" tid=1 Native
  #00  pc 0x0000000000099ccc  /apex/com.android.runtime/lib64/bionic/libc.so (syscall+28)
  #01  pc 0x000000000023247c  /apex/com.android.art/lib64/libart.so (art::ConditionVariable::WaitHoldingLocks+140)
  #02  pc 0x000000000045b218  /apex/com.android.art/lib64/libart.so (artJniMethodEnd+336)
  #03  pc 0x00000000005bf0fc  /apex/com.android.art/lib64/libart.so (art_jni_method_end+12)
  at android.os.BinderProxy.transactNative (Native method)
  at android.os.BinderProxy.transact (BinderProxy.java:685)
  at android.app.job.IJobCallback$Stub$Proxy.acknowledgeStartMessage (IJobCallback.java:434)
  at android.app.job.JobServiceEngine$JobHandler.ackStartMessage (JobServiceEngine.java:384)
  at android.app.job.JobServiceEngine$JobHandler.handleMessage (JobServiceEngine.java:196)
  at android.os.Handler.dispatchMessage (Handler.java:106)
  at android.os.Looper.loopOnce (Looper.java:257)
  at android.os.Looper.loop (Looper.java:368)
  at android.app.ActivityThread.main (ActivityThread.java:8839)
  at java.lang.reflect.Method.invoke (Native method)
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:572)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1049)

我已经搜索了几个相关问题,就像我遇到的这个 ANR 异常一样,比如 this ,但在其堆栈跟踪中很明显导致它的原因,我不确定在哪里可以找到导致此问题的部分,这与

JobServiceEngine

有关

有什么想法吗?

android multithreading thread-safety anr
1个回答
0
投票

您遇到的 ANR(应用程序无响应)问题涉及活页夹事务上的线程阻塞,这导致应用程序挂起。您提供的堆栈跟踪指出了与 JobServiceEngine 和活页夹事务相关的问题。以下是堆栈跟踪的更详细细分以及诊断和解决问题的可能方法:

堆栈跟踪细分

1.线程状态:

ANR发生在主线程(tid=1 Native),这很关键,因为主线程负责UI更新和处理核心应用程序任务。

  1. 关键堆栈跟踪元素:

libc.so (syscall+28):表示线程在系统调用中被阻塞。 libart.so (art::ConditionVariable::WaitHoldingLocks+140):显示线程正在等待条件变量,表明它正在持有锁并等待满足某些条件。 android.os.BinderProxy.transactNative:线程参与绑定器事务,通常涉及进程间通信(IPC)。

3.调用路径:

android.os.BinderProxy.transact:向远程进程发送事务请求的方法。 android.app.job.IJobCallback$Stub$Proxy.acknowledgeStartMessage:确认事务的方法。 android.app.job.JobServiceEngine$JobHandler.ackStartMessage:这是处理作业启动消息的 JobServiceEngine 的一部分。 android.os.Handler.dispatchMessage:消息正在被分派到处理程序。 android.app.ActivityThread.main:应用程序的主入口点。

可能的原因及解决方案

  1. 死锁或锁争用:

原因:线程可能死锁或发生锁争用。 ConditionVariable::WaitHoldingLocks 指示在持有锁时正在使用条件变量,如果其他线程也在等待相同的条件,则可能导致死锁。 解决方案:检查您的代码以确保正确获取和释放锁。避免在长时间操作或等待外部资源时持有锁。等待条件时使用超时,以防止无限期阻塞。

  1. JobServiceEngine 和 Binder 事务问题:

原因:该问题可能与 JobServiceEngine 如何管理作业启动消息有关。如果作业服务未正确确认消息或响应时间过长,可能会导致主线程阻塞。 解决方案:确保您的 JobService 实现高效并且不会在主线程上执行长时间操作。将繁重的工作卸载到后台线程或使用异步操作。另外,请确保及时处理任何回调或交易,不会造成延误。

  1. Binder 事务死锁:

原因:应用程序可能会在活页夹事务中遇到死锁,其中代码的一部分正在等待被另一个事务阻塞的活页夹事务。 解决方案:分析binder事务,确保不存在循环依赖或过度阻塞。如果您使用自定义活页夹服务,请确保它们有效实施。

4.外部因素:

原因:有时,问题可能源于外部因素或与其他服务或组件的交互。 解决方案:检查依赖项、第三方库或 Android 操作系统更新中是否有任何最近的更改,这些更改可能会影响活页夹事务或作业服务。

诊断步骤

1.添加日志记录:

添加有关作业服务操作和活页夹事务的详细日志记录,以了解延迟或阻塞发生的位置。

2.使用分析工具:

使用 Android Studio 的分析器分析线程活动并识别潜在的瓶颈或死锁。

3.审查 JobService 实施:

确保您的 JobService 实现遵循最佳实践,并且不会在主线程上执行耗时的任务。

  1. 检查已知问题:

在 Android 问题跟踪器或论坛中搜索与 JobServiceEngine 和活页夹事务相关的已知问题。 通过执行这些步骤,您应该能够确定 ANR 的根本原因并实施解决方案来解决它。

© www.soinside.com 2019 - 2024. All rights reserved.