应用程序崩溃(有时)与致命信号11(SIGSEGV),代码1

时间:2016-05-08 15:36:15

标签: android gson here-api sigsegv

我正在使用HERE 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中独自出现,没有其他信息。

在我的所有应用程序中,我使用的是HERE对象和服务,甚至通过打印堆栈跟踪,我也无法获得有关错误的更多信息。
我只是注意到这些错误几乎是随机出现的,但只有当我使用这些对象/服务时才会出现。

我使用真实的设备测试我的应用程序,索尼Xperia Z3紧凑型,所以我不认为它来自这里。

我真的迷失了,所以如果有人对如何获得有关错误的更多信息有任何想法,请帮助

修改

 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@app@com.david.metroz-1@base.apk@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从数据库检索HERE对象时发生了崩溃。

当所有内容都在同一个应用程序运行时完成时,以下代码有效,但是当我在数据库中保存字符串时,关闭应用程序然后重新打开它,我在转换Fatal signal时转换json string 1}}回到对象。

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

我真的不知道为什么它不起作用。

3 个答案:

答案 0 :(得分:7)

1)首先确定它是否是android,第三方库或您的设备中的错误,因此您可以知道继续进行的方式。

This answer提供了如何执行此操作的解决方案:

  

如果您已编写(或正在使用)插件,而该插件又通过NDK使用本机C / C ++代码,则可能表示该本机代码存在错误。

     

否则,这是您正在测试的设备或仿真器的固件中的错误。

     

如果您可以在仿真器,带有原始ROM的Nexus设备或不同制造商的各种设备上重现这一点,则可能是Android本身的一个错误。在这种情况下,请创建一个可以重现错误的示例项目,并将其与整个堆栈跟踪一起发布到Android操作系统问题跟踪器http://b.android.com

     

如果您只是在一台设备或一台第三方ROM上遇到此问题,则可能是一个更具体的错误 - 您最好的选择是联系设备制造商或ROM发布商以解决您的症状。

有两个问题可以详细讨论您收到的错误:

Android Fatal signal 11 (SIGSEGV) at 0x636f7d89 (code=1). How can it be tracked down?

Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1) - PhoneGap

2)在解析你的geobounds值方面(因为它似乎是问题所在的位置),确保你正确处理Gson和Json之间的解析,并使用正确的geobound值。看来你存储这些值的方式与你如何检索它们的方式不一致。

From Mykong

  

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

来自this answer

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问题提供了更多细节:
How to parse json parsing Using GSON in android
parse JSON with gson and GsonBuilder()

3)确保您为geobound co-ords传递了正确的值。 这个问题Value does not fall within the expected range GeoboundingBox WinRT(虽然它是C#,它提供了一个很好的例子,说明如何分解您试图存储和检索的信息组件。

The answer很简单。

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:

Use Gson to work with JSON in your Android apps

您还可以this gihub repo浏览更多想法。

答案 1 :(得分:2)

您可以粘贴adb logcat中的更多信息吗?目前我们没有足够的信息来帮助您。终结器守护程序中的段错误可能意味着双重删除本机对象。没有更多信息,它可以在操作系统或SDK中的任何位置。

跳过的帧意味着您的应用正在处理主线程中的大量数据。跳过161帧意味着超过3秒的忙碌时间!请尝试使用AsyncTasks或线程来优化您的应用。

您似乎正在使用GSON类型的反序列化器,它不会正确构造我们的本机对象。手动反序列化lat,lng并调用新的GeoBoundingBox()不会崩溃。

答案 2 :(得分:0)

我已通过以下代码解决了同样的问题。

Manifest 文件的应用标记中添加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>

希望这会对你有所帮助。