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)
...
関連する詳細:
- X コード 4.2
- LLVM3.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 でコンパイル) の下でクルージングされていました。
これが「宿題をする」ことと解釈されないことを願っています。私は何ヶ月も調査、微調整(この問題に対処するいくつかのアップデートをリリースしました)、そして髪を引っ張るのに何の進歩もありませんでした. 私はすべてのアイデアがありません。