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

Posted

技术标签:

【中文标题】应用程序崩溃(有时),致命信号 11 (SIGSEGV),代码 1【英文标题】:App crashes (sometimes) with Fatal signal 11 (SIGSEGV), code 1 【发布时间】:2016-09-03 06:03:03 【问题描述】:

我正在使用 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 对象和服务,即使通过打印堆栈跟踪,我也无法获得有关错误的更多信息。 我只是注意到这些错误几乎是随机出现的,但只有在我使用这些对象/服务时才会出现。

我使用真实设备来测试我的应用程序,即 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/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 转换回来到对象。

// 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) 首先确定是android、第三方库还是你的设备的bug,这样你就可以知道如何处理了。

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) 在解析地理边界值方面(看起来问题可能出在哪里),确保使用正确的地理边界值正确处理 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

这些 SO 问题提供了更多详细信息:How to parse json parsing Using GSON in androidparse JSON with gson and GsonBuilder()

3) 确保您为地理绑定坐标传递了正确的值。 这个问题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供你浏览更多想法。

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

我编辑了我的问题,但我想我发现了问题:我正在使用 gson 库将地理坐标列表和地理边界框转换为 json 字符串,我认为有时字符串不是创建得很好,所以试图用错误的字符串取回对象会搞砸,有点像this 这是一种可能性,但只是快速检查一下代码,我看不出你会如何使用该堆栈获得无效指针。能贴出崩溃的边界框坐标吗? 好吧,我尝试的每个坐标都会崩溃,但如果你愿意,你可以看看它们: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 我添加了一些代码,你知道为什么它不起作用吗? 您似乎是在不使用普通构造函数的情况下构造我们的地理边界框?很可能您的边界框代码没有调用本机代码中的主构造函数,因此它有效地创建了一个损坏的对象。你能反序列化 lat、lng 并手动调用 new GeoBoundingBox() 吗?【参考方案3】:

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

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 我不建议这样做。它可能隐藏了问题并最终破坏了 C++ 堆。 它将阻止 USB 连接。就我而言,它阻止了 USB 连接

以上是关于应用程序崩溃(有时),致命信号 11 (SIGSEGV),代码 1的主要内容,如果未能解决你的问题,请参考以下文章

应用随机崩溃与致命信号7(SIGBUS),代码2或致命信号11(SIGSEGV),代码1

当使用 webview 启动活动时,应用程序崩溃并显示“致命信号 5 (SIGTRAP),tid 13058 (Chrome_InProcRe) 中的代码 1”

致命信号 11 android Visualizer

如何在tid xxxxx(Thread-X)中解决Android致命信号11(SIGSEGV),代码1,故障地址0x0?

MobileAds.initialize(this) 崩溃 致命信号 11 (SIGSEGV),代码 1 (SEGV_MAPERR)

Android webview 崩溃“致命信号 5 (SIGTRAP)”