Android Фатальный Сигнал 11


в приложении, которое я разрабатываю на 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)
10 70

10 ответов:

Я пытался вызвать неинициализированный холст внутри другого класса, поэтому, когда он пытался получить высоту или ширину его, он рухнет.

у меня была такая же проблема с экземпляром android.сми.MediaRecorder.

код доступа #getMaxAmplitude() после #reset() и #release() был вызван экземпляр MediaRecorder.

сегодня утром у меня была такая же проблема, и я смог отследить ее, чтобы случайно сохранить изображение шириной 800 пикселей в папке drawable-mdpi. Когда я понял, что произошло, я немного повозился с ним. Я попытался сжать его, чтобы увидеть, связано ли это с размером файла, и это было не так. Затем я попытался сохранить его снова на 650 пикселей в ширину, и он работал из этой папки. Поэтому где-то между ними есть точка разрыва для каждой папки, которую я бы предположил. Затем я поставил изображение шириной 800 p в предназначенной папке hdpi и 480 P широкий в mdpi, и он исправил его.

У меня была та же проблема, и после хорошего ночного сна и кофе утром я обнаружил, что был достаточно глуп, чтобы поддержать холст с неинициализированным растровым изображением. Кажется, что многое, если не весь код рисования холста является собственным кодом, и передача неинициализированных объектов не обнаруживается везде.

SIGSEGV с нулевым адресом (0x00000000) означает, что ваше приложение разыменовало нулевой указатель, поэтому ищите места, где вы передаете нулевые указатели (т. е. пустые ссылки на экземпляры объектов, которые вы не создавали в первую очередь) для кода, который поддерживается машинным кодом и не проверяет правильность этой ошибки.

Я испытал ту же фатальную ошибку при использовании класса 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 не был инициализирован, что привело к NullPointerException и фатальной ошибке.

у меня была эта проблема, когда я делал приложение cocos2d-x на android. проблема в том, что мой слой был CCLayer:

 CCLayer::init()

но в заголовочном файле у меня было:

 class HelloWorld : public cocos2d::CCLayerColor

Я изменил CCLayerColor на CCLayer и мое приложение работало

то же самое произошло со мной во время разработки игры с использованием libGDX framework для Android, и вот почему:

у меня есть 2 экрана - GameScreen и BattleScreen. GameScreen - это место, где я перемещаю своего персонажа на карте. Когда у меня есть столкновение с вражеским спрайтом, я мгновенно использую game.setScreen(new BattleScreen(this)) и изменить текущий экран на BattleScreen. Вот где раньше случался фатальный сигнал 11. Сначала я подумал, что это как-то связано с загрузкой активов, потому что мой экземпляр asset manager был статичным. Я пытался несколько способов их загрузки, но ничего не работало. Оказалось, что я менял экран в неправильном месте. Для моего GameScreen Я WorldController и WorldRenderer экземпляра. Я использовал worldController.update() и worldRenderer.render() внутри GameScreen ' s render(float deltaTime) метод. Внутри worldController.update() Я проверял столкновения и изменение экрана, как только я нашел один с врагом. Это не было хорошо для Android, возможно, потому, что это произошло между обновлением и рендерингом, или это заняло некоторое время, пока обновление все еще работало, и это привело к конфликты-не знаю. Но вот как я это исправил:

  1. я добавил флаг типа boolean (false по умолчанию) внутри WorldController и каждый раз, когда происходило столкновение с врагом, я устанавливал его в true
  2. на GameScreen ' s render() я проверял этот флаг - если бы это было правдой, я бы изменил экран на BattleScreen, в противном случае я бы обновил и визуализировал GameScreen

теперь он отлично работает каждый раз, без фатальной ошибки сигнала 11 вообще

вот мой GameScreen ' s 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();
    }

}

в моем случае это было исключение нулевого указателя внутри события onDraw, которое препятствует завершению рисования на холсте. Я думаю, что это общее сообщение об ошибке, данное, когда проблема рисования ocurr.

У меня тоже была эта ошибка при использовании Libgdx для android, и я узнал, что эта ошибка вызвано Box2d, который использует собственный код, лучше посмотреть на часть вашего кода, который использует Box2d и посмотреть, есть ли какие-либо нулевые указатели.

в моем случае BluetoothSocket было null при попытке установить соединение Bluetooth