0

自从 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 编译)下运行了几个月。

我希望这不会被解释为“做我的功课”。我花了几个月的时间研究、调整(我已经发布了几个更新来解决这个问题)和拉扯头发,但没有任何进展。我完全没主意了。

4

2 回答 2

1

我认为这工作正常,但由于某种原因memset调用失败,返回.malloc0

于 2012-01-10T08:43:31.043 回答
0

我将发布经过数小时调试后发现的类似崩溃的解决方案,也许它对某人有用......原因很愚蠢。我在 NSLog 中有两个占位符,只有一个实变量。

NSLog(@"lastItemDate = %@ unixtime = %@", lastItemDate);
于 2013-03-15T23:55:46.237 回答