Android Fatal Signal 11

72

In der App, die ich auf Android entwickle, wird immer wieder der Fehler Fatal Signal 11 angezeigt.

Ich denke, es hat etwas mit der Art und Weise zu tun, wie ich auf den Speicher zugreife, aber ich kann nicht herausfinden, was ihn verursacht.

Jede Hilfe wird sehr geschätzt!

Hier ist die 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)
Declan Greally
quelle
6
Dies ist ein Segmentierungsfehler. Dies bedeutet, dass das Programm auf einen Speicherort zugegriffen hat, der nicht zugewiesen wurde. Zeigen Sie Ihre LogCat
Kapelchik
2
Ist ein Teil Ihres Codes in C geschrieben?
Yusuf X
2
Nein, alles ist in Java geschrieben.
Declan Greally
1
In StackOverflow können Sie eine Frage am besten als fest markieren, indem Sie Ihre eigene Antwort hinzufügen und dann akzeptieren, dass die Frage in der Liste der Fragen als gelöst markiert wird , anstatt den ursprünglichen Beitrag zu bearbeiten.
Silas Parker
1
Ja, ich habe es bearbeitet, weil ich 8 Stunden warten muss, bevor ich meine eigene Frage beantworten kann, haha.
Declan Greally

Antworten:

25

Ich hatte versucht, eine nicht initialisierte Leinwand in einer anderen Klasse aufzurufen. Wenn sie also versuchte, die Höhe oder Breite zu ermitteln, stürzte sie ab.

Declan Greally
quelle
8
Gab es etwas, das Sie speziell getan haben, um herauszufinden, dass Ihr Uneingeweihter Canvasdort einen Fehler verursacht hat? Ich habe das gleiche Problem, bin mir aber nicht sicher, wo ich die Wurzel finden kann.
Adneal
4
Ich habe das gleiche Problem, aber keine Leinwand. Ich benutze Media Player, um Videos im Internet abzuspielen?,
Ersin Gülbahar
1
Es geht nicht nur um Canvas, ich habe diesen Fehler mit einem "Final Activity Act" erlebt, der von einer "AsyncTask in einer AsyncTask" verwendet wurde, und dies war auch ein Problem dafür.
Anders Metnik
Ich habe Flurry implementiert und jetzt gibt es diesen Fehler. Fatal signal 11 (SIGSEGV) at 0x3f800010 (code=1), thread 28708 (com.application)Ich habe keine Ahnung, was los ist. Es gibt dies nur in einer Aktivität. Funktioniert gut in anderen. xx
Tushar Gogna
13

Ich hatte das gleiche Problem mit einer Instanz von android.media.MediaRecorder.

Der Code, auf den #getMaxAmplitude()nach #reset()und #release()auf der MediaRecorder-Instanz zugegriffen wurde, wurde aufgerufen.

Martin
quelle
Ich hatte das gleiche Problem. Wie behebt man das?
Mohamed Habib
Es gab keine einfache Lösung. Ich musste überprüfen, wo #getMaxAmplitude () nach #reset () oder #release () aufgerufen wurde.
Martin
1
Versuchen Sie möglicherweise, Ihr MediaRecorder-Objekt zu annullieren, nachdem Sie #reset () oder #relaese () aufgerufen haben. Dies sollte Ihnen die relevanten NPEs anzeigen
Alamgir Mand
8

Ich hatte heute Morgen das gleiche Problem und konnte es zurückverfolgen, um versehentlich ein 800 Pixel breites Bild im Ordner drawable-mdpi zu speichern. Als ich merkte, was passiert war, bastelte ich eine Sekunde daran. Ich habe versucht, es stark zu komprimieren, um festzustellen, ob es mit der Dateigröße zusammenhängt und nicht. Dann habe ich versucht, es erneut mit einer Breite von 650 Pixel zu speichern, und es hat aus diesem Ordner heraus funktioniert. Irgendwo dazwischen gibt es also die Bruchstelle für jeden Ordner, den ich vermuten würde. Dann habe ich das 800 p breite Bild in den vorgesehenen HDPI-Ordner und das 480 p breite Bild in das MDPI gelegt und es behoben.

a54studio
quelle
Es ist seltsam, aber dies scheint auch mein Problem behoben zu haben, nur meine Bilder waren nur 800 * 480.
Tore Rudberg
Ich denke, es geht um eine festgelegte größte / kleinste Größe in jedem Ordner. Wenn die Höhe oder Breite sie überschreitet, verursacht dies wahrscheinlich Ärger. Ich bin froh, dass es dir geholfen hat, ich weiß, dass ich mir den Kopf zerbrochen habe.
a54studio
Hat für mich gearbeitet! Was zum Teufel haben Entwickler vor dem Internet gemacht?
Jimbali
5

Ich hatte das gleiche Problem und stellte nach einer guten Nacht und einem Kaffee am Morgen fest, dass ich albern genug war, um die Leinwand mit einer nicht initialisierten Bitmap zu untermauern. Es scheint, dass viel, wenn nicht der gesamte Canvas-Zeichnungscode nativer Code ist und die Übergabe nicht initialisierter Objekte nicht überall erkannt wird.

SIGSEGV mit einer Nulladresse (0x00000000) bedeutet, dass Ihre Anwendung einen Nullzeiger dereferenziert hat. Achten Sie daher auf Stellen, an denen Sie Nullzeiger (dh leere Verweise auf Objektinstanzen, die Sie nicht instanziiert haben) an den gesicherten Code übergeben durch nativen Code und prüft nicht richtig auf diesen Fehler.

ChrisB
quelle
Das Überprüfen der Nullzeiger vor dem Beginn einer Ziehung ist eine gute Idee, danke =)
Cd
4

Bei der Verwendung der Canvas-Klasse ist derselbe schwerwiegende Fehler aufgetreten.
Mein Code sieht so aus. Der folgende Code initialisiert einen Bogen und zeichnet ihn auf die Leinwand.

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);
}

Das Problem trat auf, weil meine Instanz von RectF nicht initialisiert wurde, was zu NullPointerException und dem schwerwiegenden Fehler führte.

Vikas
quelle
2

Ich hatte dieses Problem, als ich eine cocos2d-x App auf Android machte. Das Problem war, dass meine Ebene eine CCLayer war:

 CCLayer::init()

aber in der Header-Datei hatte ich:

 class HelloWorld : public cocos2d::CCLayerColor

Ich habe CCLayerColor in CCLayer geändert und meine App hat funktioniert

Tim
quelle
2

Das gleiche passierte mir während der Spieleentwicklung mit dem LibGDX-Framework für Android. Und hier ist der Grund:

Ich habe 2 Bildschirme - GameScreenund BattleScreen. GameScreenHier bewege ich meinen Charakter auf der Karte. Wenn ich mit einem feindlichen Sprite kollidiere, benutze ich sofort den game.setScreen(new BattleScreen(this))aktuellen Bildschirm und ändere ihn auf BattleScreen. Hier passierte früher das Fatal Signal 11. Zuerst dachte ich, es hätte etwas mit dem Laden von Assets zu tun, da meine Asset Manager-Instanz statisch war. Ich habe mehrere Möglichkeiten zum Laden ausprobiert, aber nichts hat funktioniert. Es stellte sich heraus, dass ich den Bildschirm an der falschen Stelle wechselte. Für meine hatte GameScreenich WorldControllerund WorldRendererInstanz. Ich benutzte worldController.update()und worldRenderer.render()in GameScreen's render(float deltaTime)Methode. InnerhalbworldController.update()Ich suchte nach Kollisionen und wechselte den Bildschirm, sobald ich eine mit dem Feind fand. Es war nicht gut für Android, vielleicht weil es zwischen Update und Rendering passiert ist oder es einige Zeit gedauert hat, während das Update noch lief und es zu Konflikten führte - ich weiß nicht. Aber so habe ich es behoben:

  1. Ich habe ein boolesches Flag (standardmäßig false) hinzugefügt WorldControllerund jedes Mal, wenn eine Kollision mit dem Feind passiert ist, habe ich es auf true gesetzt
  2. In GameScreen's habe render()ich dieses Flag überprüft - wenn es wahr wäre, würde ich den Bildschirm auf ändern BattleScreen, sonst würde ich aktualisieren und rendernGameScreen

Jetzt funktioniert es jedes Mal perfekt, kein FATAL SIGNAL ERROR 11

Hier ist mein GameScreen‚s - render()Methode:

@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();
    }

}
Celebes
quelle
1

In meinem Fall war es eine Nullzeigerausnahme innerhalb eines onDraw-Ereignisses, die verhindert, dass das Zeichnen auf der Zeichenfläche abgeschlossen wird. Ich denke, es wird eine allgemeine Fehlermeldung ausgegeben, wenn ein Zeichenproblem auftritt.

jesantana
quelle
1

Ich hatte auch diesen Fehler bei der Verwendung von Libgdx für Android, und ich fand heraus, dass dieser Fehler durch Box2d verursacht wird, das nativen Code verwendet. Es ist besser, einen Teil Ihres Codes zu betrachten, der Box2d verwendet, und festzustellen, ob es Nullzeiger gibt.

David Fetcher
quelle
0

In meinem Fall BluetoothSocketwar das null, als versucht wurde, eine Bluetooth-Verbindung herzustellen

Dediqated
quelle