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)
4

10 回答 10

25

我一直试图在另一个类中调用未初始化的画布,所以当它试图获取它的高度或宽度时,它会崩溃。

于 2012-05-03T18:02:13.437 回答
13

我对 android.media.MediaRecorder 的实例有同样的问题。

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

于 2012-11-27T14:25:08.917 回答
8

今天早上我遇到了同样的问题,并且能够追溯到意外地将 800 像素宽的图像保存在 drawable-mdpi 文件夹中。当我意识到发生了什么时,我调整了一下。我试着压缩它,看看它是否与文件大小有关,但不是。然后我尝试以 650 像素宽再次保存它,它在该文件夹中起作用。因此,我猜测的每个文件夹之间都有一个断点。然后我将 800 p 宽的图像放在预期的 hdpi 文件夹中,将 480 p 宽的图像放在 mdpi 中并修复它。

于 2013-03-01T17:02:56.797 回答
5

我也遇到了同样的问题,在睡了一夜好觉,早上喝了杯咖啡后,我发现我已经傻到用未初始化的位图来支持画布了。似乎大部分(如果不是全部)画布绘图代码都是本机代码,并且未在任何地方检测到未初始化对象的传递。

具有空地址 (0x00000000) 的 SIGSEGV 意味着您的应用程序已取消引用空指针,因此请注意将空指针(即对您首先未实例化的对象实例的空引用)传递给支持的代码的位置通过本机代码,并且没有正确检查此错误。

于 2013-02-19T08:21:54.103 回答
4

我在使用 Canvas 类时遇到了同样的致命错误。
我的代码看起来像这样。下面的一段代码初始化了一个 Arc 并将其绘制在画布上。

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 实例未初始化,导致 NullPointerException 和致命错误。

于 2013-01-21T23:03:30.383 回答
2

我在 android 上制作 cocos2d-x 应用程序时遇到了这个问题。问题是我的图层是 CCLayer:

 CCLayer::init()

但在头文件中我有:

 class HelloWorld : public cocos2d::CCLayerColor

我将 CCLayerColor 更改为 CCLayer 并且我的应用程序正常工作

于 2013-02-28T01:31:32.950 回答
2

在使用 Android 的 LibGDX 框架进行游戏开发期间,我也发生了同样的事情,原因如下:

我有 2 个屏幕 -GameScreenBattleScreen. GameScreen是我在地图上移动我的角色的地方。当我与敌人精灵发生碰撞时,我立即使用game.setScreen(new BattleScreen(this))并将当前屏幕更改为BattleScreen. 这里是致命信号 11 曾经发生的地方。起初我认为这与加载资产有关,因为我的资产管理器实例是静态的。我尝试了多种加载方式,但没有任何效果。原来我在错误的地方更换了屏幕。就我而言,GameScreen我有一个例子。我正在使用and inside的方法。里面WorldControllerWorldRendererworldController.update()worldRenderer.render()GameScreenrender(float deltaTime)worldController.update()我一发现敌人就在检查碰撞并更换屏幕。这对 Android 不好,可能是因为它发生在更新和渲染之间,或者它需要一些时间,而更新仍在运行并导致冲突 - 我不知道。但这是我修复它的方法:

  1. 我在里面添加了一个布尔标志(默认为 false)WorldController,每次与敌人发生碰撞时,我都将其设置为 true
  2. GameScreen'srender()我正在检查这个标志 - 如果它是真的,我会将屏幕更改为BattleScreen,否则我会更新和渲染GameScreen

现在它每次都能完美运行,没有任何致命信号错误11

这是我GameScreenrender()方法:

@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();
    }

}
于 2014-06-19T09:35:24.780 回答
1

就我而言,这是 onDraw 事件中的一个空指针异常,它阻止了在画布上完成绘制。我认为这是出现平局问题时给出的一般错误消息。

于 2013-06-30T16:17:17.790 回答
1

I too had this error when using Libgdx for android, and I found out this error is caused by Box2d which uses native code, it is better to look at part of your code which uses Box2d and see if there is any null pointers.

于 2015-03-20T06:36:21.973 回答
0

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

于 2013-09-16T11:53:45.117 回答