2012-01-10 3 views
0

С iOS5 вышли на улицы я начавшиеся Я получаю много (очень много) отчеты об ошибках, как:MemSet вопрос 'CortexA8' под 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'
  • ИОС 5 база SDK
  • таргетинг на iOS 4.0
  • падает только под iOS5 (все модели iPhone iOS5. Нет IPad не падает, но приложение не является универсальным)
  • Не удается воспроизвести сбой на любом из моих устройств (конечно)

Теперь [FooViewController prepareShapes] не вызывает memset напрямую, а не проходит-структуру (представляющий shape) методу класса, который пытается перераспределить его. Тот факт, что трассировка стека пропускает метод класса, немного странна, но, без сомнения, это еще больше магии компилятора, которую я не понимаю. В методе класса, то блок, который вызывает 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).

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

ответ

1

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

+0

Это имеет смысл. Я добавил дополнительные проверки для сбоя 'malloc' в последнем обновлении. Если счетчик ошибок '' memset' будет заменен на ошибки «malloc' fail», я дам вам ответ (должен знать через неделю или около того). Любые идеи, почему это только выскакивает под iOS5? –

0

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

NSLog(@"lastItemDate = %@ unixtime = %@", lastItemDate); 
Смежные вопросы