Android Fatal Signal 11

В приложении, которое я разрабатываю на Android, я продолжаю получать ошибку Fatal Signal 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)

Ответ 1

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

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

Ответ 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

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

 CCLayer::init()

но в файле заголовка я:

 class HelloWorld : public cocos2d::CCLayerColor

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

Ответ 7

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

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

  • Я добавил логический флаг (false по умолчанию) внутри WorldController и каждый раз, когда произошло столкновение с противником, я устанавливал его в true
  • В GameScreen render() Я проверял этот флаг - если бы он был правдой, я бы изменил экран на 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();
    }

}

Ответ 8

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

Ответ 9

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

Ответ 10

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