2012-05-02 18 views
69

Nell'applicazione che sto sviluppando su Android, continuo a ricevere un errore Fatal Signal 11.Android Fatal Signal 11

Penso che sia qualcosa a che fare con il modo in cui sto accedendo alla memoria ma non riesco a capire cosa lo stia causando.

Qualsiasi aiuto sarà molto apprezzato!

Ecco il 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) 
+6

Questo è un errore di segmentazione, significa che il programma ha effettuato l'accesso a una posizione di memoria che non è stata assegnata. Mostra il tuo LogCat – kapand

+0

@AndreyKapelchik L'ho aggiunto alla domanda ora. –

+2

Fa parte del tuo codice scritto in C? –

risposta

23

avevo cercato di chiamare un Canvas Non inizializzato all'interno di un'altra classe in modo che quando si stava tentando di ottenere l'altezza o la larghezza di esso, potrebbe andare in crash.

+7

C'è stato qualcosa che hai fatto in particolare per capire che il tuo 'canvas' non iniziato stava causando un errore? Sto avendo lo stesso problema, ma non sono sicuro dove trovarne la radice. – adneal

+4

ı ho lo stesso problema ma non utilizzo la tela. Sto usando il lettore multimediale per riprodurre video su internet ?, –

+1

Non è solo su Canvas, ho riscontrato questo errore con un 'attività di attività finale' che è stato passato utilizzato da un "AsyncTask in un AsyncTask" e questo era anche un problema per questo. –

13

Ho avuto lo stesso problema con un'istanza di android.media.MediaRecorder.

Il codice a cui è stato fatto riferimento #getMaxAmplitude() dopo #reset() e #release() sull'istanza MediaRecorder era stato chiamato.

+0

Ho avuto lo stesso problema. come lo aggiustate? –

+0

Non c'era una soluzione semplice. Ho dovuto controllare dove #getMaxAmplitude() è stato chiamato dopo #reset() o #release(). – Martin

+1

forse prova ad annullare l'oggetto MediaRecorder dopo aver chiamato #reset() o #relaese() e questo dovrebbe mostrarti gli NPE corrispondenti –

4

Ho riscontrato lo stesso errore irreversibile durante l'utilizzo della classe Canvas.
Il mio codice sembra piace questo. Il seguente pezzo di codice inizializza un arco e lo disegna sulla tela.

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

Il problema si è verificato perché la mia istanza di RectF non è stata inizializzata che ha portato NullPointerException e l'errore fatale.

5

Ho avuto lo stesso problema e ho trovato dopo una buona notte di sonno e un caffè al mattino che ero stato abbastanza stupido da appoggiare la tela con un Bitmap non inizializzato. Sembra che molto se non tutto il codice di disegno su tela sia codice nativo e il passaggio di oggetti non inizializzati non venga rilevato ovunque.

SIGSEGV con indirizzo nullo (0x00000000) significa che l'applicazione ha eliminato il riferimento a un puntatore nullo, quindi fare attenzione ai punti in cui si passano i puntatori nulli (ad esempio riferimenti vuoti a istanze di oggetto non istanziati in primo luogo) a codice che è supportato da codice nativo e non controlla correttamente questo errore.

+0

Controllare i nullpointer prima di iniziare un sorteggio è una buona idea grazie =) –

2

ho avuto questo problema quando stavo facendo un'app cocos2d-x su Android. il problema era che il mio livello era un CCLayer:

CCLayer::init() 

ma nel file di intestazione ho avuto:

class HelloWorld : public cocos2d::CCLayerColor 

ho cambiato CCLayerColor al CCLayer e la mia app lavorato

8

Ho avuto questo stesso problema questa mattina è stato in grado di rintracciarlo per salvare accidentalmente un'immagine di 800 pixel nella cartella drawable-mdpi. Quando ho capito cosa è successo, ci ho lavorato per un secondo. Ho provato a comprimerlo per vedere se era legato alla dimensione del file e non lo era. Poi ho provato a salvarlo di nuovo a 650 pixel di larghezza e ha funzionato da quella cartella. Quindi, da qualche parte, c'è il punto di rottura per ogni cartella che indovinerei. Quindi ho inserito l'immagine di 800 p nella cartella hdpi e 480 p di larghezza nell'mdpi e l'ho riparata.

+0

È strano, ma questo sembra avere risolto anche il mio problema, solo le mie immagini erano solo 800 * 480. –

+0

Immagino che vada da una dimensione più grande/più piccola in ogni cartella. Probabilmente se l'altezza o la larghezza lo supera, provoca una seccatura. Sono contento che ti abbia aiutato, so che mi stavo tormentando. – a54studio

+0

Ha funzionato per me! Che diavolo hanno fatto gli sviluppatori prima dell'internet? – Magicode

1

Nel mio caso, si trattava di un'eccezione di puntatore nullo all'interno di un evento onDraw che impediva il completamento dell'estrazione nell'area di disegno. Penso che sia un messaggio di errore generale quando si verifica un problema di sorteggio.

0

Nel mio caso il BluetoothSocket era nulla quando si cerca di stabilire una connessione Bluetooth

2

Stessa cosa mi è successo durante lo sviluppo del gioco utilizzando quadro LibGDX per Android, ed ecco perché:

ho 2 schermi - GameScreen e BattleScreen. GameScreen è dove metto il mio personaggio sulla mappa. Quando ho una collisione con lo sprite nemico, utilizzo immediatamente lo game.setScreen(new BattleScreen(this)) e cambio la schermata corrente su BattleScreen. Ecco dove il Fatal Signal 11 accadeva. All'inizio pensavo che avesse qualcosa a che fare con il caricamento delle risorse, perché la mia istanza del gestore delle risorse era statica. Stavo provando diversi modi di caricarli ma niente ha funzionato. Si è scoperto che stavo cambiando lo schermo nel posto sbagliato. Per il mio ho avuto istanza WorldController e WorldRenderer. Stavo usando worldController.update() e worldRenderer.render() nel metodo render(float deltaTime)render(float deltaTime). Dentro lo worldController.update() stavo controllando le collisioni e cambiando schermata non appena ne ho trovata una con il nemico. Non è andata bene per Android, forse perché è successo tra l'aggiornamento e il rendering, o ci è voluto del tempo, mentre l'aggiornamento era ancora in esecuzione e portava a conflitti - non lo so. Ma ecco come ho riparato:

  1. ho aggiunto un flag booleano (false di default) all'interno WorldController e ogni volta uno scontro con il nemico è accaduto mi è stato impostato a true
  2. In GameScreen s' render() stavo controllando questo flag - se fosse vero vorrei cambiare lo schermo per BattleScreen, altrimenti avrei aggiornare e rendere GameScreen

Ora funziona perfettamente ogni volta, nessun segnale ERRORE FATALE 11 di sorta

Ecco il mio GameScreen 's render() metodo:

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

} 
1

Anch'io ho avuto questo errore quando si utilizza Libgdx per Android, e ho scoperto questo errore è causato da Box2d che utilizza codice nativo, è meglio guardare parte del tuo codice che usa Box2d e vedi se ci sono dei puntatori nulli.

Problemi correlati