什么可能导致 ART(Android 运行时)在卸载本机库时死锁?

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

我一直在尝试调试我的应用程序中的非用户可感知的崩溃(我认为它发生在后台),该崩溃可能由于死锁/线程争用而源自 Android 运行时。

backtrace:
  #00  pc 0x000000000004f560  /apex/com.android.runtime/lib64/bionic/libc.so (syscall+32)
  #01  pc 0x000000000030d9a8  /apex/com.android.art/lib64/libart.so (art::Mutex::ExclusiveLock(art::Thread*)+280)
  #02  pc 0x00000000005fe8b4  /apex/com.android.art/lib64/libart.so (art::Libraries::UnloadNativeLibraries()+96)
  #03  pc 0x00000000003ba968  /apex/com.android.art/lib64/libart.so (art::gc::Heap::CollectGarbageInternal(art::gc::collector::GcType, art::gc::GcCause, bool, unsigned int)+876)
  #04  pc 0x00000000003ba50c  /apex/com.android.art/lib64/libart.so (art::gc::Heap::ConcurrentGC(art::Thread*, art::gc::GcCause, bool, unsigned int)+164)

Caused DefaultDispatcher-worker-9 failure : SuspendThreadByPeer timed out: 14060 (HeapTaskDaemon), state&flags: 0x9, priority: 5, barriers: 0x<sanitized>, ours: 0x<sanitized>, barrier value: 1, nsusps: 0, ncheckpts: 0, thread_info: Target states: [14060 (HeapTaskDaemon) S 1097 1097 0 0 -1 1077936192 231570 372 345 3 170 481 0 1 24 4 74, 14060 (HeapTaskDaemon) S 1097 1097 0 0 -1 1077936192 390055 372 345 3 219 832 0 1 24 4 74]1@517142581380 Final wait time: 4.010s

我查看了 UnloadNativeLibraries 的源代码here,看起来这个

jni_libraries_lock_
是在加载本机共享库时获取的。

但是我就是无法理解这是怎么发生的。在我的应用程序中,我创建了一个自己的本机库,在运行时加载。我不知道是不是这个原生库做错了什么

本机库可能会执行哪些操作,导致 ART 无法获取锁?我还能做些什么来调试这个问题吗?

android android-ndk java-native-interface android-runtime
1个回答
0
投票

这不一定是由于您自己的本机库所致。看看您是否可以识别此时正在加载的库 - 通过日志(如果您有权访问这些库)或线程转储(如果持有该锁的线程上的跟踪给出了任何指示)。

如果库很大或者在

JNI_OnLoad
/
JNI_OnUnload
中执行过多操作,则加载/卸载可能需要很长时间。请参阅此处有关使用
RegisterNatives
以获得更好性能的提示。

顺便说一句,看起来这个僵局将在未来的 ART 版本中得到修复

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