【问题标题】:Android Fatal Signal 11Android 致命信号 11
【发布时间】:2012-05-12 11:32:41
【问题描述】:

在我正在 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)

【问题讨论】:

  • 这是分段错误,意味着程序访问了未分配的内存位置。展示你的 LogCat
  • 你的部分代码是用 C 写的吗?
  • 不,都是用Java写的。
  • 在 StackOverflow 上 best way to mark a question as fixed is to add your own answer and then accept that 而不是编辑原始帖子,然后问题在问题列表中被标记为已解决。
  • 是的,我编辑了它,因为我必须等待 8 小时才能回答我自己的问题哈哈。

标签: java android crash signals


【解决方案1】:

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

【讨论】:

  • 你有没有做过什么特别的事情来找出你的外行 Canvas 导致了那里的错误?我遇到了同样的问题,但我不确定在哪里可以找到它的根源。
  • 我有同样的问题,但没有使用画布。我正在使用媒体播放器在互联网上播放视频?,
  • 不仅仅是关于 Canvas,我在“最终活动行为”中遇到了这个错误,它被“AsyncTask 中的 AsyncTask”使用,这也是它的一个问题。跨度>
  • 我实现了 Flurry,现在它给出了这个错误Fatal signal 11 (SIGSEGV) at 0x3f800010 (code=1), thread 28708 (com.application) 我不知道发生了什么。它只是在一项活动中给出这个。在别人那里工作得很好。 x.x
【解决方案2】:

我在使用 android.media.MediaRecorder 的实例时遇到了同样的问题。

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

【讨论】:

  • 我遇到了同样的问题。你是怎么解决的?
  • 没有简单的修复方法。我必须检查在#reset() 或#release() 之后调用#getMaxAmplitude() 的位置。
  • 也许在您调用 #reset() 或 #relaese() 之后尝试使您的 MediaRecorder 对象无效,这应该会向您显示相关的 NPE
【解决方案3】:

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

【讨论】:

  • 这很奇怪,但这似乎也解决了我的问题,只有我的图像只有 800*480。
  • 我猜它在每个文件夹中都有一个最大/最小的大小。可能如果高度或宽度超过它,那么它会引起麻烦。很高兴它对你有所帮助,我知道我正在为此绞尽脑汁。
  • 为我工作!在互联网出现之前,开发者到底在做什么?
【解决方案4】:

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

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

【讨论】:

  • 在开始抽签之前检查空指针是个好主意,谢谢 =)
【解决方案5】:

我在使用 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 和致命错误。

【讨论】:

    【解决方案6】:

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

     CCLayer::init()
    

    但在我的头文件中:

     class HelloWorld : public cocos2d::CCLayerColor
    

    我将 CCLayerColor 更改为 CCLayer 并且我的应用正常运行

    【讨论】:

      【解决方案7】:

      在使用 Android 的 LibGDX 框架开发游戏时,我也遇到了同样的事情,原因如下:

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

      1. 我在 WorldController 中添加了一个布尔标志(默认为 false),每次与敌人发生碰撞时我都将其设置为 true
      2. GameScreenrender() 中,我正在检查这个标志 - 如果它是真的,我会将屏幕更改为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();
          }
      
      }
      

      【讨论】:

        【解决方案8】:

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

        【讨论】:

          【解决方案9】:

          我在使用 Libgdx for android 时也遇到了这个错误,我发现这个错误是 由使用本机代码的 Box2d 引起的,最好查看使用 Box2d 的部分代码,看看是否有任何空指针。

          【讨论】:

            【解决方案10】:

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

            【讨论】:

              猜你喜欢
              • 2012-12-27
              • 1970-01-01
              • 1970-01-01
              • 2012-09-16
              • 2015-02-06
              • 2013-10-05
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多