Memset 'CortexA8' проблема под iOS5 - PullRequest
0 голосов
/ 10 января 2012

С тех пор как iOS5 вышла на улицы, я начал получать много (очень много) сообщений о сбоях, таких как:

...
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)
...

Соответствующие данные:

  • XCode 4.2
  • LLVM 3.0
  • архитектура armv6 armv7
  • iOS 5 базовый SDK
  • нацеливание на iOS 4.0
  • вылетает только под iOS5 (все модели iPhone5 с iOS5. Не вылетает iPad, но приложение не универсально)
  • Не могу воспроизвести сбой ни на одном из моих устройств (конечно)

Теперь [FooViewController prepareShapes] не вызывает memset напрямую, вместо этого передает структуру (представляющую форму) методу класса, который пытается перераспределить его. Тот факт, что трассировка стека пропускает метод класса, немного странный, но, без сомнения, это еще больше волшебства компилятора, которого я не понимаю. Внутри метода класса блок, который вызывает memset, выглядит следующим образом:

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

А вот структура, которой манипулируют

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

Я понимаю, что это не совсем близко к рекомендованному способу работы с OpenGL, однако, что меня действительно пугает (и я в полном восторге от этого), так это то, что memset взрывается только под iOS5 (я Я использую QuincyKit для сбора отчетов о сбоях и HockeyApp для их агрегирования). Этот точный код использовался под iOS4 (скомпилирован с GCC) в течение нескольких месяцев.

Надеюсь, это не интерпретируется как «делай домашнее задание». Я потратил месяцы на исследования, настройку (я выпустил несколько обновлений, посвященных этой проблеме) и потянув за собой волосы без прогресса. У меня нет идей.

Ответы [ 2 ]

1 голос
/ 10 января 2012

Я думаю, что memset работает нормально, но вызов malloc почему-то не удался, возвращая 0.

0 голосов
/ 16 марта 2013

Я опубликую информацию о подобной аварии, которую я нашел после часа отладки, может быть, это было бы полезно для кого-то ... Причина была в такой глупости. У меня было два заполнителя в NSLog и только одна реальная переменная.

NSLog(@"lastItemDate = %@ unixtime = %@", lastItemDate);
...