Domanda

Dato che iOS5 colpito le strade che ho iniziato ho ricevuto molti (tanti) i rapporti schianto come:

...
Exception Type:  SIGSEGV
Exception Codes: SEGV_ACCERR at 0x0
Crashed Thread:  0

Thread 0 Crashed:
0   libsystem_c.dylib  0x35ec4b3c memset$VARIANT$CortexA8 + 116
1   FooApp             0x0005ba25 -[FooViewController prepareShapes] (FooViewController.m:808)
...

dettagli rilevanti:

  • XCode 4.2
  • LLVM 3.0
  • 'ARMv6 ARMv7' architetture
  • iOS 5 SDK di base
  • mira iOS 4.0
  • si blocca sotto solo iOS5 (tutti i modelli di iPhone iOS5. Nessun iPad si blocca, ma app non è universale)
  • Non è possibile riprodurre l'incidente su uno dei miei dispositivi (ovviamente)

Ora [FooViewController prepareShapes] non chiama direttamente memset, passa invece una struct (che rappresenta una forma) per un metodo di classe che i tentativi di realloc esso. Il fatto che i cassonetti della traccia dello stack sopra il metodo di classe è un po 'strano, ma senza dubbio è magia ancora più compilatore non capisco. All'interno del metodo di classe, il blocco che richiama memset è la seguente:

// class method invoked by [FooViewController prepareShapes]:808 (shape is coloured2DShape instance) 
shape->maxVertexCount = maxVertexes;
if (shape->maxVertexBytes != 0)
{
    free(shape->vertices);
}
shape->maxVertexBytes = sizeof(vertex_2D_4byteColour) * shape->maxVertexCount;
shape->vertices = (vertex_2D_4byteColour *)malloc(shape->maxVertexBytes);
memset(shape->vertices, 0, shape->maxVertexBytes);

Ed ecco la struct manipolato

// coloured2DShape struct
typedef struct coloured2DShape
{
    vertex_2D_4byteColour* vertices;
    GLushort* indices;
    uint maxVertexBytes;
    uint maxIndexBytes;
    int vertexCount;
    int indexCount;
    int maxVertexCount;
    int maxIndexCount;
} coloured2DShape;

Mi rendo conto che questo non è da nessuna parte vicino al modo consigliato di fare OpenGL, tuttavia la cosa che veramente mi bamboozles (e io sono veramente bene e ingannati qui) è che memset è solo soffia sotto iOS5 (io sono utilizzando QuincyKit per raccogliere segnalazioni di crash e HockeyApp per aggregare loro). Questo codice esatto era stato crociera lungo sotto iOS4 (compilato con GCC) per mesi.

Spero che questo non sia interpretato come una cosa 'fare i compiti'. Ho trascorso mesi alla ricerca, tweaking (ho pubblicato diversi aggiornamenti che affrontano questo problema) e tirate di capelli con alcun progresso. Sono tutti fuori di idee.

È stato utile?

Soluzione

I'd think that memset is working fine, but the call to malloc failed for some reason, returning 0.

Altri suggerimenti

I'm gonna publish the soution of similar crash I found after hour of debugging, maybe it would be useful for somebody... The reason was in so stupid thing. I had two placeholders in NSLog and only one real variable.

NSLog(@"lastItemDate = %@ unixtime = %@", lastItemDate);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top