2017-04-14 23 views
1

私は、約5分間の集中的な使用の後、私のアプリがクラッシュしているという報告をいくつかのユーザーから受け取りました。私はGoogle Playでクラッシュログを受け取りました。その一例が下に添付されています。メッセージがあるように思わ:Xamarin Android弱参照テーブルオーバーフローの原因を診断するにはどうすればよいですか?

JNIエラー(アプリのバグ):弱グローバル参照テーブルのオーバーフロー(最大= 51200)」

私はJNIに慣れていないよので、何かアドバイス/説明をいただければ幸いです/これを理解する方法の提案。考えられる原因は、コード内の何かがクリーンアップされていないことですが、何ですか?この問題は、上で報告されてい

デバイスは、ネクサス5.xのギャラクシーS7ネクサス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 
+0

あなたがこれを追跡するために有効にすることができGREFログのドキュメントの全体部分があります:https://developer.xamarin.com/guides/android/troubleshooting/troubleshooting/#Global_Reference_Messages –

+0

おかげで、私はこの記事を読んで、有効にしていますロギングそれはgwrefc 0、ほとんどすべての時間を言う。私はそれが時間が経つにつれて成長するのを期待していました。実行時にgrefcとgwrefcの現在の状態を問い合わせる方法があるかどうか知っていますか?テストのためにユーザーにカスタムAPKを渡すことができました。 –

+0

環境プロパティを設定することができます:https://developer.xamarin.com/guides/android/advanced_topics/environment/#Xamarin.Android_System_Properties次に、アプリケーションがクラッシュすると、ユーザーに 'adb logcat'を要求しますか?ローカルに複製できない場合は、少し難しいでしょう。 –

答えて

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で追跡されていますこれはスレッドローカル値です。

+0

この記事を読むと、プログラムでクエリするセクションが表示されませんでした。しかし、WeakGlobalReferenceCountは常にXamarin Androidで-1を返します。このファイルの81行目:https://github.com/xamarin/xamarin-android/blob/master/src/Mono.Android/Android.Runtime/AndroidRuntime.cs。私はNexus 9で-1を得ていたのでそれを調べました。 –

+0

それは私がそのセクションを追加したからです。私は-1が問題かもしれないと思います。しかし、あなたは 'LocalReferenceCount'を使うことができます。https://github.com/xamarin/java.interop/blob/a1d3ecc8ba6e67b96ae1c633194b0e78c2ac5c23/src/Java.Interop/Java.Interop/JniEnvironment.cs#L35-L37 –

+0

申し訳ありません。決定的なものはありませんが、私は1人のユーザーからいくつかの新しいフィードバックを得ています。彼は、grefcが46,000以上になると、アプリがクラッシュすることを観察しました。 Nexus 9で状況を再現すると、アプリがクラッシュせず、grefcが6,000にリセットされます。 grefcのクリーンアップに関連する問題のあるコードがありますか? –

関連する問題