如何诊断Xamarin Android弱引用表溢出的原因?

时间:2017-04-14 01:21:33

标签: android memory xamarin java-native-interface

我有几个用户的报告说我的应用程序在大约使用5分钟后崩溃了。我收到了Google Play上的崩溃日志,下面附有一个示例。消息似乎是:

JNI错误(应用程序错误):弱全局引用表溢出(max = 51200)'

我对JNI并不熟悉,并且非常感谢任何关于如何解决这个问题的建议/解释/建议。可能的原因是我的代码中的某些东西没有得到清理,但是什么?

此问题已报告的设备是 Nexus 5.x Galaxy S7 Nexus 6

相关代码可以在我的开源项目中找到:https://gitlab.com/hodgskin-callan/Invention。但是,我没有最低限度的代码来重现该问题,并且它不能在我的Nexus 9上重现。我怀疑这个问题并没有影响到大多数Android用户。

*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
Build fingerprint: 'google/bullhead/bullhead:7.1.1/N4F26T/3687331:user/release-keys'
Revision: 'rev_1.0'
ABI: 'arm'
pid: 10404, tid: 10404, name: .x10host.pathos  >>> com.x10host.pathos <<<
signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
Abort message: 'art/runtime/indirect_reference_table.cc:132] JNI ERROR (app bug): weak global reference table overflow (max=51200)'
    r0 00000000  r1 000028a4  r2 00000006  r3 00000008
    r4 f300558c  r5 00000006  r6 f3005534  r7 0000010c
    r8 00000000  r9 0000000a  sl 00001785  fp f0385400
    ip 0000000b  sp ffde7b50  lr f1a065e7  pc f1a08e44  cpsr 200f0010

backtrace:
    #00 pc 00049e44  /system/lib/libc.so (tgkill+12)
    #01 pc 000475e3  /system/lib/libc.so (pthread_kill+34)
    #02 pc 0001d8a5  /system/lib/libc.so (raise+10)
    #03 pc 000193f1  /system/lib/libc.so (__libc_android_abort+34)
    #04 pc 00017034  /system/lib/libc.so (abort+4)
    #05 pc 0031a5f1  /system/lib/libart.so (_ZN3art7Runtime5AbortEPKc+328)
    #06 pc 000b5205  /system/lib/libart.so (_ZN3art10LogMessageD2Ev+1132)
    #07 pc 001bc42b  /system/lib/libart.so (_ZN3art22IndirectReferenceTable3AddEjPNS_6mirror6ObjectE+194)
    #08 pc 0023a097  /system/lib/libart.so (_ZN3art9JavaVMExt16AddWeakGlobalRefEPNS_6ThreadEPNS_6mirror6ObjectE+46)
    #09 pc 0027f483  /system/lib/libart.so (_ZN3art3JNI16NewWeakGlobalRefEP7_JNIEnvP8_jobject+418)
    #10 pc 0000de14  /data/app/com.x10host.pathos-2/lib/arm/libmonodroid.soapp/com.x10host.pathos-2/lib/arm/libmonodroid.so

1 个答案:

答案 0 :(得分:0)

这里有关于这个主题的一篇很长但非常有用的文档:

https://developer.xamarin.com/guides/android/troubleshooting/troubleshooting/#Global_Reference_Messages

对于第一次传递,您应尝试通过.txt文件启用系统属性,该文件将Build Action设置为$(AndroidEnvironment)

即。 debug.mono.log gref

https://developer.xamarin.com/guides/android/advanced_topics/environment/#Xamarin.Android_System_Properties

然后,您将从设备中获取adb logcat,其中将包含此日志记录。

但是,如果这对你不利,那么

您应该可以直接通过以下方式查询:

Java.Interop.JniRuntime.CurrentRuntime.GlobalReferenceCount

Java.Interop.JniRuntime.CurrentRuntime.WeakGlobalReferenceCount

本地引用也在Java.Interop.JniEnvironment.LocalReferenceCount中跟踪,这是一个线程本地值。