Приложение сбой (иногда) с фатальным сигналом 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/[email protected]@[email protected]@classes.dex
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.

Следующий код работает, когда все выполняется в одной и той же среде выполнения приложения, но когда я сохраняю строку в базе данных, закрываю приложение и затем снова открываю его, я получаю 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)

Я действительно не знаю, почему это не работает.

Ответ 1

1) Сначала определите, является ли это ошибкой внутри андроида, сторонних библиотек или вашего устройства, чтобы вы могли знать, каким образом действовать дальше.

Этот ответ дает решение, как это сделать:

Если вы написали (или используете) плагин, который, в свою очередь, использует собственный код C/C++ через NDK, это может указывать на ошибку в этом собственном коде.

В противном случае это ошибка в прошивке устройства или эмулятора, который вы тестируете.

Если вы можете воспроизвести это в эмуляторе, на устройстве Nexus с оригинальным ПЗУ или на различных устройствах разных производителей, это, вероятно, ошибка в самом Android. В этом случае создайте пример проекта, который может воспроизвести ошибку, и опубликуйте ее вместе со всей трассировкой стека на http://b.android.com, трекере проблем ОС Android.

Если вы сталкиваетесь с этим только на одном устройстве или одном стороннем ПЗУ, это, вероятно, более конкретная ошибка - лучше всего обратиться к производителю устройства или издателю ПЗУ с вашими симптомами.

Есть два вопроса, в которых подробно обсуждается ошибка, которую вы получаете:

Фатальный сигнал Android 11 (SIGSEGV) при 0x636f7d89 (код = 1). Как это можно отследить?

Фатальный сигнал 11 (SIGSEGV) при 0x00000000 (код = 1) - 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

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 дают более подробную информацию:
Как разобрать анализ JSON Использование GSON в Android
разбирать JSON с помощью gson и GsonBuilder()

3) Убедитесь, что вы передаете правильные значения для ваших геопривязанных координат. Этот вопрос Значение не попадает в ожидаемый диапазон GeoboundingBox WinRT (хотя это С# дает хороший пример того, как разбить компоненты информации, которую вы пытаетесь сохранить и извлечь.

Ответ прост.

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

И научитесь разбирать ваш JSON с помощью GSON:

Используйте Gson для работы с JSON в ваших приложениях для Android

Существует также этот репозиторий Gihub для вас, чтобы найти больше идей.

Ответ 2

Можете ли вы вставить больше информации из adb logcat? В настоящее время нам недостаточно информации, чтобы помочь вам. Segfault в демонере финализатора может подразумевать двойное удаление собственных объектов. Без дополнительной информации он может быть где угодно в ОС или в SDK.

Пропущенные кадры означают, что ваше приложение обрабатывает большое количество данных в основном потоке. Пропуск 161 кадра означает более 3-х рабочих часов! Попробуйте использовать AsyncTasks или потоки для оптимизации вашего приложения.

Кажется, вы используете десериализатор типа GSON, который не будет правильно строить наши собственные объекты. В ручном десериализации лата, lng и вызова нового GeoBoundingBox() не произойдет сбой.

Ответ 3

Я решил такую ​​же проблему, следуя коду.

Добавить android:vmSafeMode="true" в тег приложения в файле Манифест.

Ваш тег приложения должен выглядеть так:

<application
    android:name=".MyApplication"
    android:hardwareAccelerated="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:largeHeap="true"
    android:theme="@style/AppTheme"
    android:vmSafeMode="true">

    // Other stuff

 </application>

Надеюсь, это поможет вам.