应用程序有时会崩溃,并显示致命信号11(SIGSEGV),代码1。

19
我正在使用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对象时会发生崩溃。

以下代码在同一应用程序运行时完成一切工作,但是当我将字符串保存在数据库中,关闭应用程序,然后重新打开它时,将json字符串转换回对象时出现致命信号

// 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
现在我也遇到了同样的问题。我有一个应用程序,随机更改片段。它在应用程序崩溃时显示相同的错误,但这是非常随机的行为,意味着没有模式。但它会崩溃。 - Abdul Waheed
3个回答

8

1) 首先确定是Android系统、第三方库还是设备本身的错误,以便知道应该采取哪种方式。

这个答案提供了如何解决问题的方法:

如果您编写或使用插件,并通过NDK使用本机C / C ++代码,则可能表示存在本机代码中的错误。

否则,这是在测试设备或模拟器上的固件中的错误。

如果您可以在模拟器中、使用原始ROM的Nexus设备上或在来自不同制造商的各种设备上复现此错误,则很可能是Android本身的错误。在这种情况下,请创建一个可重现错误的示例项目,并将其与整个堆栈跟踪一起发布到http://b.android.com,即Android OS问题跟踪器。

如果您只在一个设备或一个第三方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) 在解析您的地理边界值方面(似乎问题可能出在这里),请确保正确处理Gson和Json之间的解析,使用正确的地理边界值。看起来您存储值的方式与检索值的方式不符。

来自Mykong的链接

toJson() – Convert Java object to 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() – Convert JSON to Java object

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)确保您传递了正确的geobound坐标的值。这个问题(虽然是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:

在你的Android应用程序中使用Gson处理JSON

此外,这个Github仓库也可以提供更多的想法。


2

你能从adb logcat中再贴一些信息吗?现在提供的信息还不足以帮助我们解决问题。 finalizer daemon 中的 segfault 可能意味着本地对象被重复删除。没有更多的信息,它可能出现在操作系统或SDK中的任何位置。

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

看起来你正在使用GSON类型反序列化器,这将无法正确构造我们的本地对象。手动反序列化lat、lng并调用new GeoBoundingBox()不会崩溃。


这是有可能的,但是我快速检查了代码,没有看到您如何使用该堆栈产生无效指针。您能否发布导致崩溃的边界框坐标? - David Leong
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 - David Seroussi
看起来你正在构建我们的地理边界框,但没有使用正常的构造函数?很可能你的边界框代码没有调用本地代码中的主构造函数,因此实际上它创建了一个损坏的对象。你可以尝试反序列化纬度和经度,然后手动调用新的GeoBoundingBox()构造函数吗? - David Leong
是的,因为您正在尝试反序列化本地对象 :) 底层的地理边界框对象由本地指针支持。因此,您序列化的只是指向内存中某个位置的 C++ 指针。将其序列化为经纬度公共类,它应该可以工作。 - David Leong
我给它投了反对票,因为它不是正确的答案。它包含了许多与问题无关的信息。我并不是在寻找悬赏,只是想让SDK变得更好。顺便说一句:我是HERE SDK的原始作者之一 :) - David Leong
显示剩余7条评论

1

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

Manifest文件中的application标签中添加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>

希望这能帮到你。

我不知道为什么,但是这样避免了致命信号的出现。就像 @DavidLeong 所说的那样,我序列化了一个 C++ 指针,因此当我关闭并重新打开应用程序时,指针变成了空值。现在我能更清楚地看到问题了,因为我没有收到错误,反而得到了带有空坐标的对象:0.000000, 0.000000;0.000000, 0.000000 - David Seroussi
我不建议这样做。这可能会隐藏问题,并最终破坏 C++ 堆。 - David Leong
它将阻止 USB 连接。在我的情况下,它阻止了 USB 连接。 - Hosein Haqiqian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接