自从 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 下崩溃(所有 iOS5 iPhone 型号。没有 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 编译)下运行了几个月。
我希望这不会被解释为“做我的功课”。我花了几个月的时间研究、调整(我已经发布了几个更新来解决这个问题)和拉扯头发,但没有任何进展。我完全没主意了。