安卓致命信号11

72

在我正在开发的Android应用中,我一直收到致命信号11错误。

我认为这与我访问内存的方式有关,但我无法确定是什么原因导致了这个问题。

以下是LogCat:

05-02 23:47:17.618: D/dalvikvm(590): GC_FOR_ALLOC freed 68K, 4% free 6531K/6787K, paused 101ms
05-02 23:47:17.638: I/dalvikvm-heap(590): Grow heap (frag case) to 7.619MB for 1228816-byte allocation
05-02 23:47:17.738: D/dalvikvm(590): GC_CONCURRENT freed 1K, 4% free 7730K/8007K, paused 5ms+14ms
05-02 23:47:17.878: D/dalvikvm(590): GC_FOR_ALLOC freed <1K, 4% free 7730K/8007K, paused 37ms
05-02 23:47:17.888: I/dalvikvm-heap(590): Grow heap (frag case) to 8.790MB for 1228816-byte allocation
05-02 23:47:17.998: D/dalvikvm(590): GC_CONCURRENT freed <1K, 4% free 8930K/9223K, paused 4ms+4ms
05-02 23:47:17.998: A/libc(590): Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1)

2
你的代码中有部分是用C语言编写的吗? - Yusuf X
2
不,它全部都是用Java编写的。 - Declan Greally
10个回答

25

我一直在尝试调用另一个类中未初始化的Canvas,当它尝试获取其高度或宽度时,会导致崩溃。


8
你是否有采取特定措施来确定未初始化的Canvas是导致错误的原因?我也遇到了同样的问题,但不确定如何找到其根源。 - adneal
1
这并不仅仅与画布有关,我曾经在使用“AsyncTask中的AsyncTask”传递了一个final Activity act时遇到过这个错误,这是它出现问题的根本原因。 - Anders Metnik
我实现了Flurry,但现在它出现了这个错误:“Fatal signal 11 (SIGSEGV) at 0x3f800010 (code=1),thread 28708 (com.application)”。我不知道发生了什么。它只在一个活动中出现。在其他活动中正常工作。x.x - Tushar Gogna

13

我遇到了与一个android.media.MediaRecorder实例相关的同样问题。

在调用MediaRecorder实例的reset()和release()之后,代码访问了getMaxAmplitude()。


我曾经也遇到过同样的问题。你是怎么解决的? - Mohamed Habib
没有简单的解决方案。我必须检查在 #reset() 或者 #release() 后 #getMaxAmplitude() 被调用了没有。 - Martin
1
也许在调用 #reset() 或 #release() 后将您的 MediaRecorder 对象置空,这样就可以显示相关的 NPEs。 - Alamgir Mand

8
今早我也遇到了同样的问题,后来发现是因为不小心把一张800像素宽的图片保存在了drawable-mdpi文件夹里。当我意识到这个问题后,我试着去修复它。我尝试着将其压缩以查看是否与文件大小有关,但并没有效果。然后我将其重新保存为650像素宽,并将其放到另一个文件夹里,这次就成功了。所以我想,每个文件夹之间都存在着某种断点。最后,我将800像素宽的图片放到了适合它的hdpi文件夹中,将480像素宽的图片放到了mdpi文件夹中,这样问题就解决了。

很奇怪,但这似乎也解决了我的问题,只是我的图像尺寸只有800*480。 - Tore Rudberg
我猜它是按每个文件夹中的最大/最小尺寸集来确定的。如果高度或宽度超过了它,那么就会引起麻烦。很高兴它能帮到你,我知道我也曾为此苦苦思索。 - a54studio

5

我曾经遇到了同样的问题,经过一个好的睡眠和早上一杯咖啡的启示,我发现我的错误在于用未初始化的位图对画布进行备份。似乎大部分(如果不是全部)画布绘制代码都是本地代码,并且未检测到未初始化对象的传递。

使用空地址(0x00000000)会导致SIGSEGV,这意味着您的应用程序已经解除了空指针,因此请注意,在向由本地代码支持且未正确检查此错误的代码传递空指针(即尚未实例化的对象实例的空引用)的位置。


在开始绘制之前检查空指针是个好主意,谢谢 =) - C.d.

4

使用Canvas类时,我遇到了相同的致命错误。
我的代码如下所示。以下代码段初始化一个弧并在画布上绘制它。

private RectF r1 = null;
private final Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);

public Arc(Context ctx) {
    super(ctx);
    mPaint.setColor(0xFFFF0000);
    r1 = new RectF(200, 200, 400, 400);
}

protected void onDraw(Canvas canvas) {
   super.onDraw(canvas);
   canvas.drawArc(r1, 0, 90, true, mPaint);
}

问题的发生是因为我的RectF实例没有初始化,结果导致了空指针异常和致命错误。

2
在使用LibGDX框架进行Android游戏开发时,我遇到了同样的问题。这是为什么:
我有两个屏幕——GameScreen和BattleScreen。GameScreen是我在地图上移动角色的地方。当我与敌人精灵碰撞时,我立即使用game.setScreen(new BattleScreen(this))将当前屏幕更改为BattleScreen。这就是Fatal Signal 11出现的地方。起初,我认为这与加载资源有关,因为我的资源管理器实例是静态的。我尝试了多种加载方式,但都没有成功。事实证明,我在错误的位置更改了屏幕。对于我的GameScreen,我有WorldController和WorldRenderer实例。我在GameScreen的render(float deltaTime)方法中使用worldController.update()和worldRenderer.render()。在worldController.update()内部,我检查碰撞并在发现与敌人之一时立即更改屏幕。这对于Android来说不太好,也许是因为它发生在更新和渲染之间,或者花费了一些时间,而更新仍在运行,导致冲突——我不知道。但是这是我如何解决它的方法:
1. 我在WorldController中添加了一个布尔标志(默认为false),每次发生与敌人的碰撞时,我都将其设置为true。
2. 在GameScreen的render()中,我检查了这个标志——如果它为true,我就会将屏幕更改为BattleScreen,否则我会更新和渲染GameScreen。
现在每次都可以完美地工作,没有任何FATAL SIGNAL ERROR 11。以下是我的GameScreen的render()方法:
@Override
public void render(float deltaTime) {

    if(worldController.isCollisionWithEnemy()) {

        game.setScreen(game.battleScreen);

    } else {

        if(!paused) {
            worldController.update(deltaTime);
        }

        Gdx.gl.glClearColor(57.0f / 255.0f, 181.0f / 225.0f, 115.0f / 255.0f, 1.0f);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

        worldRenderer.render();
    }

}

2

我在制作一个安卓平台的cocos2d-x应用时遇到了这个问题。问题是我的层是一个CCLayer:

 CCLayer::init()

但是在头文件中我有:

 class HelloWorld : public cocos2d::CCLayerColor

我将CCLayerColor更改为CCLayer,我的应用程序就可以工作了。

1
当我在使用Libgdx来开发Android应用时,也遇到了这个错误。我发现这个错误是由Box2d引起的,因为它使用本地代码。最好查看你的代码中使用Box2d的部分,看是否存在空指针。请注意保留HTML标签。

1
在我的情况下,是一个空指针异常发生在onDraw事件内,导致画布无法完成绘制。我认为这是一个通用的错误消息,在绘制问题发生时会出现。

0
在我的情况下,当尝试建立蓝牙连接时,BluetoothSocket为空。

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