web-dev-qa-db-fra.com

L'application se bloque (parfois) avec le signal fatal 11 (SIGSEGV), code 1

Je développe une application avec le SDK ICI, et tout a bien fonctionné jusqu'à présent. Je reçois des erreurs comme celle-ci:
Fatal signal 11 (SIGSEGV), code 1, fault addr 0x750057 in tid 10206 (FinalizerDaemon)
ou celui-ci:
Fatal signal 11 (SIGSEGV), code 1, fault addr 0x94789680 in tid 24605 (FinalizerDaemon)

et ils font planter mon application.

Ce ne sont pas toujours les mêmes erreurs, mais elles viennent toujours toutes seules dans mon Logcat, sans aucune autre information.

Dans toute mon application, j'utilise ICI des objets et des services, et même en imprimant le stacktrace, je n'obtiens pas plus d'informations sur les erreurs.
Je viens de remarquer que ces erreurs apparaissent à peu près au hasard, mais uniquement lorsque j'utilise ces objets/services.

J'utilise un véritable appareil pour tester mon application, un Sony Xperia Z3 compact, donc je ne pense pas que cela vienne d'ici.

Je suis vraiment perdu, donc si quelqu'un a une idée, même comment obtenir plus d'informations sur les erreurs, veuillez aider

MODIFIER:

 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)

EDIT 2: Je suis maintenant à peu près sûr que le crash se produit lorsque je récupère des objets ICI de la base de données en utilisant gson.

Le code suivant fonctionne lorsque tout est fait dans le même runtime d'application, mais lorsque j'enregistre une chaîne dans la base de données, fermez l'application, puis rouvrez-la, j'obtiens le Fatal signal lors de la conversion du json string retour à l'objet.

// 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)

Je ne sais vraiment pas pourquoi ça ne marche pas.

13
David Seroussi

1) Déterminez d'abord s'il s'agit d'un bogue dans Android, les bibliothèques tierces ou votre appareil, afin de savoir de quelle manière procéder.

Cette réponse donne une solution sur la façon de procéder:

Si vous avez écrit (ou utilisez) un plugin qui à son tour utilise du code natif C/C++ via le NDK, cela peut indiquer un bogue dans ce code natif.

Sinon, il s'agit d'un bogue dans le micrologiciel de l'appareil ou de l'émulateur sur lequel vous testez.

Si vous pouvez reproduire cela dans un émulateur, sur un appareil Nexus avec la ROM d'origine ou sur une variété d'appareils de différents fabricants, c'est probablement un bogue dans Android lui-même. Dans ce cas, veuillez créer un exemple de projet qui peut reproduire l'erreur et le publier avec la trace de la pile entière sur http://b.Android.com , le Android OS suivi des problèmes.

Si vous ne rencontrez cela que sur un appareil ou une ROM tierce, il s'agit probablement d'un bogue plus spécifique - votre meilleur pari est de contacter le fabricant de l'appareil ou l'éditeur ROM avec vos symptômes).

Il y a ces deux questions qui discutent en détail de l'erreur que vous recevez:

Android Fatal signal 11 (SIGSEGV) à 0x636f7d89 (code = 1). Comment le retrouver?

Signal fatal 11 (SIGSEGV) à 0x00000000 (code = 1) - PhoneGap

2) En termes d'analyse de vos valeurs géographiques (comme il semblerait que ce soit le problème), assurez-vous de gérer correctement votre analyse entre Gson et Json, avec les valeurs géographiques correctes. Il apparaît que la façon dont vous stockez les valeurs n'est pas conforme à la façon dont vous les récupérez.

De Mykong :

toJson () - Convertir Java en 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 () - Convertit JSON en Java

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);

De cette réponse :

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

Ces SO questions donnent plus de détails:
Comment analyser l'analyse json en utilisant GSON dans Android
analyse JSON avec gson et GsonBuilder ()

3) Assurez-vous de transmettre les valeurs correctes pour vos coordonnées de géolocalisation. Cette question la valeur ne tombe pas dans la plage attendue GeoboundingBox WinRT (bien qu'il s'agisse de C # donne un bon exemple de la façon de décomposer les composants des informations que vous essayez de stocker et de récupérer.

La réponse est simple.

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);

Et apprenez à analyser votre json avec gson:

tilisez Gson pour travailler avec JSON dans vos Android

Il y a aussi ce repo gihub pour vous de parcourir pour plus d'idées.

8
Yvette Colomb

Pouvez-vous coller plus d'informations depuis adb logcat? Pour l'instant, ce n'est pas assez d'informations pour vous aider. Une erreur de segmentation dans le démon du finaliseur peut impliquer une double suppression des objets natifs. Sans plus d'informations, il pourrait se trouver n'importe où dans le système d'exploitation ou dans le SDK.

Les cadres ignorés signifient que votre application traite de nombreuses données dans le thread principal. Sauter 161 images signifie plus de 3 secondes de temps occupé! Veuillez essayer d'utiliser AsyncTasks ou des threads pour optimiser votre application.

Il semble que vous utilisiez un désérialiseur de type GSON, qui ne construira pas correctement nos objets natifs. La désérialisation manuelle du lat, lng et l'appel de la nouvelle GeoBoundingBox () ne se bloqueront pas.

2
David Leong