С 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).
Надеюсь, это не интерпретируется как вещь «сделай мою домашнюю работу». Я провел месяцы исследований, настройки (я выпустил несколько обновлений, посвященных этой проблеме) и вытягивание волос без каких-либо успехов. У меня все идеи.
Это имеет смысл. Я добавил дополнительные проверки для сбоя 'malloc' в последнем обновлении. Если счетчик ошибок '' memset' будет заменен на ошибки «malloc' fail», я дам вам ответ (должен знать через неделю или около того). Любые идеи, почему это только выскакивает под iOS5? –