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

问题描述:

我正在开发一个应用程序与HERE sdk,并eveything工作良好,直到现在。我得到这样一个错误:
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)应用程序崩溃(有时)与致命的信号11(SIGSEGV),代码1

,他们让我的应用程序崩溃。

这并不总是相同的错误,但他们总是独自一人在我的Logcat中,没有其他信息。

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

我用一个真实的设备来测试我的应用程序,索尼的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/[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从数据库检索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) 

我真的不知道为什么它不工作..

+0

现在我有同样的问题。我有一个应用程序和随机更改片段。它显示了与应用程序崩溃相同的错误,但它非常随机的行为意味着没有这种模式。但它会崩溃 –

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

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

看来你使用的是GSON类型反序列化器,它不会正确地构造我们的本地对象。手动反序列化lat,lng并调用新的GeoBoundingBox()不会崩溃。

+0

我编辑了我的问题,但我认为我发现了这个问题:我正在使用gson库将地理坐标和地理数据框列表转换为json字符串,而且我认为有时该字符串没有很好地创建,所以试图让对象返回错误的字符串混乱起来,有点像[this](http://*.com/a/31866823/5921902) –

+0

这是一种可能性,但只需快速检查代码我没有看到你将如何使用该堆栈的无效指针。你能发布崩溃边界框的坐标吗? –

+1

好吧,它与我尝试的每个坐标都崩溃了,但是如果你愿意,你可以看看它们:'gb:right = Lat:48.86490904039134,Long:2.39895392405874,Alt:0.0 left = Lat:48.864913,Long:2.3988175,Alt :0.0 center = Lat:48.86491102019567,Long:2.3988857120293696,Alt:1.073741824E9'。 –

1)首先判断它是否在Android中的一个bug,第三方库或设备,这样你就可以知道进行哪种方式。

This answer给出了如何做到这一点的解决方案:

如果你已经写了(或正在使用),然后再将通过NDK使用原生的C/C++代码插件,这可能表明中的错误那个本地代码。

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

如果你能在一个仿真器与原来的ROM再现这一点,Nexus设备上,或者在各种来自不同制造商的设备,它可能是在安卓本身就是一个错误。在这种情况下,请创建可重现错误,并与整个堆栈跟踪张贴一起http://b.android.com,Android操作系统问题跟踪的样本项目。

如果你只遇到这一个设备或一个第三方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之间的解析,并使用正确的地理空间值。它看起来如何存储这些值与你如何回溯它们不一致。

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 

这些所谓的问题提供更多的细节:
How to parse json parsing Using GSON in android
parse JSON with gson and GsonBuilder()

3)确保您传递正确的价值观为您geobound共同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为你浏览更多的想法。

我已经通过下面的代码解决同样的问题。

应用标签添加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> 

希望这会帮助你。

+0

我不知道如何,但是这可以避免致命的信号,但是@DavidLeong说我正在序列化一个C++指针,所以当我关闭并重新打开应用程序时,指针为空。我现在可以更好地看到它,因为不是获取错误,而是获取空坐标为:0,000000,000000,0,000000,000000' –

+0

@DavidSeroussi的对象,我希望您的问题得到解决。 –

+0

我不会推荐这样做。它可能隐藏了问题并最终破坏了C++堆。 –