我一直在尝试调试我的应用程序中的非用户可感知的崩溃(我认为它发生在后台),该崩溃可能由于死锁/线程争用而源自 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 无法获取锁?我还能做些什么来调试这个问题吗?