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 ответов:
Я пытался вызвать неинициализированный холст внутри другого класса, поэтому, когда он пытался получить высоту или ширину его, он рухнет.
у меня была такая же проблема с экземпляром 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
' srender(float deltaTime)
метод. ВнутриworldController.update()
Я проверял столкновения и изменение экрана, как только я нашел один с врагом. Это не было хорошо для Android, возможно, потому, что это произошло между обновлением и рендерингом, или это заняло некоторое время, пока обновление все еще работало, и это привело к конфликты-не знаю. Но вот как я это исправил:
- я добавил флаг типа boolean (false по умолчанию) внутри
WorldController
и каждый раз, когда происходило столкновение с врагом, я устанавливал его в true- на
GameScreen
' srender()
я проверял этот флаг - если бы это было правдой, я бы изменил экран наBattleScreen
, в противном случае я бы обновил и визуализировалGameScreen
теперь он отлично работает каждый раз, без фатальной ошибки сигнала 11 вообще
вот мой
GameScreen
' srender()
способ:@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.