web-dev-qa-db-ja.com

Fatal signal 11(SIGSEGV)、コード1でアプリがクラッシュする(時々)

私はここでSDKを使用してアプリを開発していますが、これまではすべて正常に機能していました。次のようなエラーが表示されます。
Fatal signal 11 (SIGSEGV), code 1, fault addr 0x750057 in tid 10206 (FinalizerDaemon)
またはこれ:
Fatal signal 11 (SIGSEGV), code 1, fault addr 0x94789680 in tid 24605 (FinalizerDaemon)

そして、それらは私のアプリをクラッシュさせます。

常に同じエラーとは限りませんが、Logcatでは他の情報なしで常に単独で表示されます。

すべてのアプリで、ここでオブジェクトとサービスを使用しています。スタックトレースを印刷しても、エラーに関する詳細情報は得られません。
これらのエラーはほとんどランダムに表示されることに気づきましたが、これらのオブジェクト/サービスを使用している場合のみです。

私はアプリをテストするために実際のデバイス、Sony Xperia Z3 compactを使用していますので、ここから来るとは思いません。

私は本当に失われているので、誰かがエラーに関する詳細情報を入手する方法についても考えているなら、助けてください

編集:

 05-09 23:04:10.148 6770-6782/? A/libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0x4 in tid 6782 (FinalizerDaemon)
05-09 23:04:10.266 30179-30179/? I/DEBUG: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
05-09 23:04:10.266 30179-30179/? I/DEBUG: UUID: 5569a1b9-c913-4101-99fa-5099e2cadd48
05-09 23:04:10.266 30179-30179/? I/DEBUG: Build fingerprint: 'Sony/D5803/D5803:5.1.1/23.4.A.1.264/2418263178:user/release-keys'
05-09 23:04:10.266 30179-30179/? I/DEBUG: Revision: '0'
05-09 23:04:10.266 30179-30179/? I/DEBUG: ABI: 'arm'
05-09 23:04:10.266 30179-30179/? I/DEBUG: pid: 6770, tid: 6782, name: FinalizerDaemon  >>> com.david.metroz <<<
05-09 23:04:10.266 30179-30179/? I/DEBUG: signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x4
05-09 23:04:10.294 30179-30179/? I/DEBUG:     r0 98327400  r1 00000000  r2 00000002  r3 00000000
05-09 23:04:10.294 30179-30179/? I/DEBUG:     r4 aec264c0  r5 b3df7acc  r6 98327400  r7 73652348
05-09 23:04:10.294 30179-30179/? I/DEBUG:     r8 6f9983a8  r9 b482a800  sl 12f1d820  fp b3df7abc
05-09 23:04:10.294 30179-30179/? I/DEBUG:     ip b5303950  sp b3df7ab0  lr b510717f  pc a0b7205c  cpsr a00e0010
05-09 23:04:10.294 30179-30179/? I/DEBUG:     #00 pc 000f405c  /data/app/com.david.metroz-1/lib/arm/libMAPSJNI.so (Java_com_nokia_maps_GeoBoundingBoxImpl_destroyNative+76)
05-09 23:04:10.294 30179-30179/? I/DEBUG:     #01 pc 001d7d4f  /data/dalvik-cache/arm/data@[email protected]@[email protected]
05-09 23:04:12.302 862-1274/? E/NativeCrashListener: Exception dealing with report
                                                     Android.system.ErrnoException: read failed: EAGAIN (Try again)
                                                         at libcore.io.Posix.readBytes(Native Method)
                                                         at libcore.io.Posix.read(Posix.Java:165)
                                                         at libcore.io.BlockGuardOs.read(BlockGuardOs.Java:230)
                                                         at Android.system.Os.read(Os.Java:350)
                                                         at com.Android.server.am.NativeCrashListener.consumeNativeCrashData(NativeCrashListener.Java:240)
                                                         at com.Android.server.am.NativeCrashListener.run(NativeCrashListener.Java:138)

編集2: gsonを使用してデータベースからHEREオブジェクトを取得すると、クラッシュが発生することが確実になりました。

次のコードは、すべてが同じアプリランタイムで実行されたときに機能しますが、データベースに文字列を保存し、アプリを閉じてから再度開くと、Fatal signal変換中json stringオブジェクトに戻ります。

// to insert I create a json string and then insert it in the database
String mGbSortie = gson.toJson(geoboundinBox);

//and then to retrieve the data :
Type gbType = new TypeToken<GeoBoundingBox>(){}.getType();
geoBoudingBox = gson.fromJson(stringFromDb, listType)

なぜ機能しないのか本当にわかりません。

13
David Seroussi

1)最初に、それがAndroid、サードパーティライブラリ、またはデバイス内のバグであるかどうかを判断します。これにより、どの方法で進むべきかを知ることができます。

この答え これを行う方法の解決策を示します:

NDKを通じてネイティブC/C++コードを順番に使用するプラグインを記述した(または使用している)場合、これはそのネイティブコードのバグを示している可能性があります。

それ以外の場合、これはテスト対象のデバイスまたはエミュレーターのファームウェアのバグです。

これをエミュレータ、元のROMを搭載したNexusデバイス、またはさまざまなメーカーのさまざまなデバイスで再現できる場合は、おそらくAndroid自体のバグです。その場合、エラーを再現できるサンプルプロジェクトを作成し、スタックトレース全体と共に http://b.Android.com 、the Android OS問題トラッカー。

これが1つのデバイスまたは1つのサードパーティのROMでのみ発生している場合、それはおそらくより具体的なバグです。デバイスメーカーまたはROMパブリッシャーに症状を連絡することをお勧めします。

受け取っているエラーについて詳しく説明する次の2つの質問があります。

x636f7d89(code = 1)のAndroid Fatal signal 11(SIGSEGV)。どのように追跡できますか?

x00000000(コード= 1)での致命的な信号11(SIGSEGV)-PhoneGap

2)ジオバウンド値の解析に関しては(問題が存在する可能性があると思われるため)、正しいジオバウンド値を使用してGsonとJson間の解析を正しく処理していることを確認してください。どのように値を保存するかは、値を取得する方法と一致しないようです。

ミコンから

toJson()– JavaオブジェクトをJSONに変換

Gson gson = new Gson();
Staff obj = new Staff();

// 1. Java object to JSON, and save into a file
gson.toJson(obj, new FileWriter("D:\\file.json"));

// 2. Java object to JSON, and assign to a String
String jsonInString = gson.toJson(obj);

fromJson()– JSONをJava objectに変換

Gson gson = new Gson();

// 1. JSON to Java object, read it from a file.
Staff staff = gson.fromJson(new FileReader("D:\\file.json"), Staff.class);

// 2. JSON to Java object, read it from a Json String.
String jsonInString = "{'name' : 'mkyong'}";
Staff staff = gson.fromJson(jsonInString, Staff.class);

// JSON to JsonElement, convert to String later.
JsonElement json = gson.fromJson(new FileReader("D:\\file.json"), JsonElement.class);
String result = gson.toJson(json);

この回答 から:

public class YourObject {
   private String appname;
   private String Version;
   private String UUID;
   private String WWXY;
   private String ABCD;
   private String YUDE;
   //getters/setters


YourObject parsed = new Gson().fromJson(jsons, YourObject.class);  

String jsons = "{'appname':'application', 'Version':'0.1.0', 'UUID':'300V', 'WWXY':'310W', 'ABCD':'270B', 'YUDE':'280T'}";
YourObject parsed = new Gson().fromJson(jsons, YourObject.class);  

JsonObject object = new JsonParser().parse(jsons).getAsJsonObject();
object.get("appname"); // application 
object.get("Version"); // 0.1.0

これらのSOの質問で詳細を確認できます。
AndroidでGSONを使用してJSON解析を解析する方法
gsonおよびGsonBuilder()でJSONを解析

3)ジオバウンド座標に正しい値を渡していることを確認してください。この質問 値はGeoboundingBox WinRTの期待される範囲内に収まりません (ただし、C#は、保存および取得しようとしている情報のコンポーネントを分解する方法の良い例です。

答え は簡単です。

var nw = new BasicGeoposition();
nw.Latitude = Max(pos.Coordinate.Latitude, pos2.lat);
nw.Longitude = Min(pos.Coordinate.Longitude, pos2.lng);
var se = new BasicGeoposition();
se.Latitude = Min(pos.Coordinate.Latitude, pos2.lat);
se.Longitude = Max(pos.Coordinate.Longitude, pos2.lng);

そして、gsonでjsonを解析する方法を学びます:

Gsonを使用して、Androidアプリ

this gihub repo もあり、より多くのアイデアを参照できます。

8
Yvette Colomb

Adb logcatからさらに情報を貼り付けることはできますか?現在、私たちがあなたを助けるのに十分な情報ではありません。ファイナライザデーモンのセグメンテーション違反は、ネイティブオブジェクトの二重削除を意味する場合があります。これ以上の情報がなければ、OSまたはSDKのどこにでもある可能性があります。

スキップされたフレームは、アプリがメインスレッドで大量のデータを処理していることを意味します。 161フレームをスキップすることは、3秒以上のビジー時間を意味します! AsyncTasksまたはスレッドを使用してアプリを最適化してください。

GSON型デシリアライザーを使用しているようですが、ネイティブオブジェクトを正しく構築できません。 lat、lngを手動でデシリアライズし、新しいGeoBoundingBox()を呼び出してもクラッシュしません。

2
David Leong