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)
別のクラス内で初期化されていないCanvasを呼び出そうとしていたので、その高さまたは幅を取得しようとするとクラッシュしました。
Android.media.MediaRecorderのインスタンスでも同じ問題が発生しました。
MediaRecorderインスタンスの#getMaxAmplitude()
および#reset()
が呼び出された後、#release()
にアクセスするコード。
今朝、この同じ問題が発生し、誤ってdrawable-mdpiフォルダーに幅800ピクセルの画像を保存するまで追跡することができました。何が起こったかに気付いたとき、私はそれを少しいじりました。圧縮してファイルサイズに関連しているかどうかを確認するために、ハードに圧縮してみました。それから幅650ピクセルでもう一度保存してみましたが、そのフォルダーからはうまくいきました。そのため、その間のどこかに、私が推測するすべてのフォルダーのブレークポイントがあります。次に、800 p幅の画像を目的のhdpiフォルダーに、480 p幅の画像をmdpiに入れて修正しました。
私は同じ問題を抱えていて、良い睡眠と朝のコーヒーの後、初期化されていないビットマップでキャンバスをバックアップするのに十分な愚かさを見つけました。キャンバスの描画コードのすべてがネイティブコードであるとは限りませんが、初期化されていないオブジェクトの受け渡しはどこでも検出されないようです。
Nullアドレス(0x00000000)のSIGSEGVは、アプリケーションがnullポインターを逆参照していることを意味するため、nullポインター(つまり、最初にインスタンス化されていないオブジェクトインスタンスへの空の参照)を渡す場所を探してくださいネイティブコードによって、このエラーを適切にチェックしません。
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と致命的なエラーが発生したために発生しました。
Android用のLibGDXフレームワークを使用したゲーム開発中に同じことが起こりました。その理由は次のとおりです。
GameScreen
とBattleScreen
の2つの画面があります。 GameScreen
は、マップ上でキャラクターを移動する場所です。敵のスプライトと衝突した場合、すぐにgame.setScreen(new BattleScreen(this))
を使用し、現在の画面をBattleScreen
に変更します。 Fatal Signal 11が発生する場所は次のとおりです。最初は、アセットマネージャーインスタンスが静的であるため、アセットの読み込みに関係があると考えました。私はそれらをロードする複数の方法を試しましたが、何も機能しませんでした。間違った場所で画面を変更していたことがわかりました。 GameScreen
には、WorldController
およびWorldRenderer
インスタンスがありました。 GameScreen
のworldController.update()
メソッド内でworldRenderer.render()
およびrender(float deltaTime)
を使用していました。内部worldController.update()
敵との衝突を発見するとすぐに、衝突をチェックして画面を変更していました。更新とレンダリングの間に発生したか、更新がまだ実行されていて競合が発生するのに時間がかかったためか、Androidには適していませんでした-わかりません。しかし、ここに私がそれを修正した方法があります:
WorldController
内にブールフラグ(デフォルトではfalse)を追加し、敵との衝突が発生するたびにtrueに設定しましたGameScreen
のrender()
でこのフラグをチェックしていました-trueの場合、画面をBattleScreen
に変更し、そうでない場合はGameScreen
を更新してレンダリングします今では毎回完璧に動作し、致命的な信号エラー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();
}
}
androidでcocos2d-xアプリを作成しているときにこの問題が発生しました。問題は、私のレイヤーがCCLayerだったことです。
CCLayer::init()
しかし、ヘッダーファイルには:
class HelloWorld : public cocos2d::CCLayerColor
cCLayerColorをCCLayerに変更し、アプリが機能しました
私もLibgdx for Androidを使用しているときにこのエラーが発生しました。このエラーはネイティブコードを使用するBox2dが原因であることがわかりました。
私の場合、onDrawイベント内のnullポインター例外が原因で、キャンバス上で描画が完了しませんでした。ドローの問題が発生したときに表示される一般的なエラーメッセージだと思います。
私の場合、Bluetooth接続を確立しようとしたときにBluetoothSocket
はnullでした