我正在用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对象和服务,即使通过打印stacktrace,我也无法获得有关错误的更多信息
我只是注意到这些错误几乎是随机出现的,但只有当我使用这些对象/服务时才会出现。
我用一台真正的设备来测试我的应用程序,一台索尼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对象时,会发生崩溃。
当所有事情都在同一个应用程序运行时完成时,以下代码可以工作,但当我在数据库中保存字符串,关闭应用程序然后重新打开它时,我会在将json string
转换回对象的同时获得Fatal signal
。
// 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)首先确定这是android、第三方库还是您的设备中的错误,这样您就可以知道该如何继续。
这个答案给出了如何做到这一点的解决方案:
如果您已经编写(或正在使用)一个插件,该插件又通过NDK使用本机C/C++代码,这可能表明该本机代码中存在错误。
否则,这是您正在测试的设备或模拟器的固件中的错误。
如果你能在模拟器中,在带有原始ROM的Nexus设备上,或者在不同制造商的各种设备上复制这一点,那么这可能是Android本身的一个缺陷。在这种情况下,请创建一个可以重现错误的示例项目,并将其与整个堆栈跟踪一起发布到http://b.android.com,Android操作系统问题跟踪器。
如果你只在一台设备或一个第三方ROM上遇到这种情况,这可能是一个更具体的错误——你最好联系设备制造商或ROM发行商,了解你的症状。
有两个问题详细讨论了您收到的错误:
安卓致命信号11(SIGSEGV)在0x636f7d89(代码=1)。如何追踪?
0x00000000处的致命信号11(SIGSEGV)(代码=1)-PhoneGap
2) 在解析您的地理边界值方面(这似乎是问题所在),请确保使用正确的地理绑定值正确处理Gson和Json之间的解析。你储存价值的方式似乎与你检索价值的方式不一致。
来自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);
根据这个答案:
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应用程序中使用JSON
还有这个gihub repo可以让你浏览更多的想法。
你能从adb-logcat中粘贴更多信息吗?目前我们没有足够的信息来帮助您。终结器守护进程中的segfault可能意味着双重删除本机对象。如果没有更多信息,它可能在操作系统或SDK中的任何位置。
跳过的帧意味着你的应用程序正在主线程中处理大量数据。跳过161帧意味着超过3秒的繁忙时间!请尝试使用AsyncTasks或线程来优化您的应用程序。
看起来您使用的是GSON类型的反序列化程序,它将无法正确构造我们的本机对象。手动反序列化lat、lng并调用新的GeoBoundingBox()不会崩溃。
我通过以下代码解决了同样的问题。
在清单文件的应用程序标记中添加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>
希望这对你有帮助。