致命信号11 (SIGSEGV) 在0x00000000处 (code=1) - PhoneGap

47

我现在使用PhoneGap开发Android应用程序。最近,当我尝试在HTML页面之间切换时,应用程序关闭,并且在LogCat中出现以下错误:

12-24 15:43:39.237: A/libc(23631): Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1), thread 23631 (.example.app)

我在谷歌上搜索了一下这个错误,我理解这与设备的内存有关。我找到了一些解决方案,但并不确定如何在PhoneGap中实现。

这里有人遇到过这个错误吗?我该怎么解决这个问题呢?

谢谢 :)


9
这可能是因为多个线程同时调用相同对象上的本地方法。请参见:https://dev59.com/eWgv5IYBdhLWcg3wW_h_#11812665。因此,答案是进行同步并确保您的代码是线程安全的。 - Luis
9个回答

44

如果您编写了一个(或者正在使用)插件,该插件通过NDK调用本地的C/C++代码,那么这可能意味着本地代码存在错误。

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

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

如果您只在一个设备或一个第三方ROM上遇到此问题,那么它很可能是更具体的错误--您最好将您的症状联系设备制造商或ROM发布者。


1
谢谢,你帮了我很多。我会尝试获取另一个设备来检查他,如果有必要的话,我会稍后更新。 :) - Yehuda
谢谢。那解决了我的问题。为什么安卓不提供正确的错误信息呢?太糟糕了。 - Bagusflyer

16

我在xhdpi的Nexus 7上遇到了类似的错误,但是在我的旧手机上一切都正常。我的问题出现在更新一个具有许多小按钮的大型GridView时。

A/libc(7410): Fatal signal 11 (SIGSEGV) at 0xbe8a8000 (code=1), thread 7410

我认为这不是你的问题,因为你的电脑是0,而我的电脑是0xbe8a8000,但是尝试一下很容易,它解决了我的问题,所以我打算发布它,以防其他人在寻找SEGV解决方案时遇到同样的问题。
有关类似问题的讨论可以在https://github.com/MasDennis/Rajawali/issues/313 上找到,其中有人提到他们遇到了相同的问题,并且关闭硬件加速解决了该问题。这很容易尝试并解决了我的问题。
在Android清单应用程序中添加:

android:hardwareAccelerated="false"

希望这能帮助其他人……


谢谢,这是模拟器的原因。将hardwareAccelerated设置为false,它就不会崩溃了,但现在我得到了:"eglMakeCurrent(917):error 0x3001(EGL_NOT_INITIALIZED)"。 - marco
@steven smith 我正在使用 android:hardwareAccelerated="false",但我仍然没有解决我的问题,我的应用程序仍然崩溃。 你有没有其他想法来解决这个错误 "Fatal signal 11 (SIGSEGV), code 1, fault addr 0xa5156d60 in tid 21028 (lfontpro.source)"。 谢谢 - patel135

11

我曾经在一个项目中遇到同样的问题。结果发现,我加载了很多图像和声音,导致应用程序在尝试实例化活动时耗尽内存。你的程序是否使用了大量内存密集型资产?你能减少它们的大小吗?

在我的情况下,LogCat在“Fatal signal 11 (SIGSEGV)”行之前立即有一串绿色的堆栈跟踪(INFO级别的日志记录)。这个堆栈跟踪是一个OutOfMemoryException,当应用程序加载一个我正在启动的Activity的资产时发生的。于是我打开了我的可绘制对象(我的程序有很多),编辑它们以减小它们的文件大小,再次尝试。错误消失了。如果你的LogCat输出看起来像我的,你就可以看看是否有类似的问题:

01-15 05:20:40.462: E/dalvikvm-heap(4513): Out of memory on a 3145744-byte allocation.
01-15 05:20:40.462: I/dalvikvm(4513): "main" prio=5 tid=1 RUNNABLE
01-15 05:20:40.462: I/dalvikvm(4513):   | group="main" sCount=0 dsCount=0 obj=0x4158b6a0 self=0x41001a60
01-15 05:20:40.462: I/dalvikvm(4513):   | sysTid=4513 nice=0 sched=0/0 cgrp=apps handle=1074673744
01-15 05:20:40.462: I/dalvikvm(4513):   | schedstat=( 0 0 0 ) utm=41 stm=20 core=1
01-15 05:20:40.462: I/dalvikvm(4513):   at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
01-15 05:20:40.462: I/dalvikvm(4513):   at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:592)
01-15 05:20:40.462: I/dalvikvm(4513):   at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:445)
01-15 05:20:40.462: I/dalvikvm(4513):   at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:781)
01-15 05:20:40.462: I/dalvikvm(4513):   at android.content.res.Resources.loadDrawable(Resources.java:1963)
01-15 05:20:40.462: I/dalvikvm(4513):   at android.content.res.Resources.getDrawable(Resources.java:672)
01-15 05:20:40.462: I/dalvikvm(4513):   at com.kbi.speeddraw.lite.game.drawables.character.ExplodingCharacterDrawable.<init>(ExplodingCharacterDrawable.java:27)
<!-- snip -->
01-15 05:20:40.462: I/dalvikvm(4513):   at com.kbi.gameengine.api.gameactivity.GameActivity.onCreate(GameActivity.java:80)
01-15 05:20:40.472: I/dalvikvm(4513):   at android.app.Activity.performCreate(Activity.java:5048)
01-15 05:20:40.472: I/dalvikvm(4513):   at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094)
01-15 05:20:40.472: I/dalvikvm(4513):   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2052)
01-15 05:20:40.472: I/dalvikvm(4513):   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2113)
01-15 05:20:40.472: I/dalvikvm(4513):   at android.app.ActivityThread.access$700(ActivityThread.java:139)
01-15 05:20:40.472: I/dalvikvm(4513):   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1224)
01-15 05:20:40.472: I/dalvikvm(4513):   at android.os.Handler.dispatchMessage(Handler.java:99)
01-15 05:20:40.472: I/dalvikvm(4513):   at android.os.Looper.loop(Looper.java:137)
01-15 05:20:40.472: I/dalvikvm(4513):   at android.app.ActivityThread.main(ActivityThread.java:4918)
01-15 05:20:40.472: I/dalvikvm(4513):   at java.lang.reflect.Method.invokeNative(Native Method)
01-15 05:20:40.472: I/dalvikvm(4513):   at java.lang.reflect.Method.invoke(Method.java:511)
01-15 05:20:40.472: I/dalvikvm(4513):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1004)
01-15 05:20:40.472: I/dalvikvm(4513):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:771)
01-15 05:20:40.472: I/dalvikvm(4513):   at dalvik.system.NativeStart.main(Native Method)
01-15 05:20:40.472: A/libc(4513): Fatal signal 11 (SIGSEGV) at 0x00000be0 (code=1), thread 4513 (.speeddraw.lite)
01-15 05:20:40.472: A/libc(4513): Fatal signal 11 (SIGSEGV) at 0x00180500 (code=1), thread 4527 (.speeddraw.lite)

1
还有一件事可能导致了我的错误:应用程序在第二个线程中耗尽了内存,而不是主UI线程。我不知道这是否加剧了情况。我正在Galaxy S3上开发。 - Kevin
你把图片压缩了多少?我的图片只有720x720像素(与Galaxy S3的宽度相同)。我只压缩了25%,但并没有什么区别。显然,我不想压缩太多,否则它们会开始变得模糊。 - MSpeed
哇,谢谢。那么你会说最终应用程序中的图像质量明显变差了吗?我将我的图像缩小到停止崩溃的大小,但现在图像比我想要的要小。 - MSpeed
我没有那么多的资产,所以我能够保持它们相当大。目前我的大多数资产大小在10-100 KB之间,我无法察觉到任何质量损失。话虽如此,我的应用程序使用的艺术风格已经是“样式糟糕”,因此可能会有一些退化,但这并不明显,因为它本来就不应该看起来很精致。 - Kevin
有方法可以在不降低图像尺寸的情况下减小文件大小。你的图像编辑软件在保存时是否显示质量设置? - Kevin
显示剩余2条评论

5
以下 Google Plus 帖子解决了我的问题:
基本上,这个问题与9patches文件中的光学边界有关。在我的情况下,我正在使用从Holo主题复制的更新的9 patches。正如link所解释的那样,这些新的patches在旧版本的Android中是无效的。

谢谢,这正是我的问题 - 我永远不会猜到这是源头。 - Martin Konecny
这就是我的问题。你真是个救命恩人。 - Daniel Ochoa

5

检查我的应用是否存在内存不足问题,我在三星S3上启动Activity时出现了这个错误,因为我要管理大量的图片。我谷歌了很多回复,但没有找到解决方法,因为我根本没有EditText或任何输入(实际上,我不知道为什么错误会显示“spannable string zero length”而不是像OutOfMemory等其他问题),后来我意识到按分辨率排序的图片放错了文件夹,并且过大,导致堆栈溢出。

祝好运!


3

确保您拥有assets目录下的所有资源图像。我曾经遇到过这个问题,结果发现我的其中一张图片丢失了。一旦我将该图片放回assets目录下,一切都正常了。


1
以下方法对我有效,已解决webview中的错误:
webView.freeMemory();

或者

webView.clearCache(true);

第二个选项会使您的应用程序变慢。

1

使用这个选项...

options.headers = { "Connection":"close" };


0

对我来说,问题出在Chrome Webview上。我禁用了Chrome并启用了Android Webview。这对我来说很好用。


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