我坚持以下崩溃报告:
Date/Time: 2013-09-12 22:39:54 +0000
OS Version: iPhone OS 6.1.3 (10B329)
Report Version: 104
Exception Type: SIGSEGV
Exception Codes: SEGV_ACCERR at 0xa0000008
Crashed Thread: 0
Thread 0 Crashed:
0 libobjc.A.dylib 0x39a3c564 _cache_getImp + 4
1 libobjc.A.dylib 0x39a3e1d7 class_respondsToSelector + 31
2 CoreFoundation 0x31b96605 objectIsKindOfClass + 37
3 CoreFoundation 0x31b9635d __handleUncaughtException + 69
4 libobjc.A.dylib 0x39a41a65 _objc_terminate() + 129
5 libc++abi.dylib 0x3948e07b safe_handler_caller(void (*)()) + 79
6 libc++abi.dylib 0x3948e114 std::terminate() + 20
7 libc++abi.dylib 0x3948f599 __cxa_current_exception_type + 1
8 libobjc.A.dylib 0x39a419d1 objc_exception_rethrow + 13
9 CoreFoundation 0x31adcf21 CFRunLoopRunSpecific + 457
10 CoreFoundation 0x31adcd49 CFRunLoopRunInMode + 105
11 GraphicsServices 0x356a82eb GSEventRunModal + 75
12 UIKit 0x339f2301 UIApplicationMain + 1121
13 Our App 0x0003bc27 main (main.m:15)
经过多次尝试修复导致此错误的错误后,我不断从 PLCrashReporter (来自我们的 beta 测试人员的临时构建)一次又一次地收到此崩溃日志。不同的异常代码从 SIGSEGV/SEGV_ACCERR 到 SIGBUS/BUS_ADRALN 到 EXC_BAD_ACCESS/KERN_INVALID_ADDRESS
我在 iOS(armv7 和 armv7s)上使用rapidjson 库和此处描述的填充修复(#8),我使用 Objective-c 运行时函数在运行时添加方法实现(使用class_addMethod
)。
我们的代码库大部分是 Objective-C 代码,一些 Obj-C++ 和一些 C 代码。内存管理由 ARC 完成,但 Obj-C++ 和 C 部分是手动处理的。我查看了每个 malloc/free 调用,并广泛使用 libgmalloc 来确定内存问题,但没有什么对我来说不正确。
我自己无法重现此崩溃日志,不在调试或发布模式下,但我们的 beta 测试人员会不时向我发送此崩溃日志(大约 50 次运行中有 1 次)。由于我们的产品(希望)很快就会在许多 iOS 设备上运行,这不是我们可以打破的。
在阅读了很多内存管理文章后,我怀疑这个问题是由内存对齐错误引起的。因此我怀疑 rapidjson 是这个错误的原因。我对 iOS / armv7 上的内存对齐缺乏了解,因此无法修复此崩溃日志。有人可以在 iOS 上向我解释更多关于这个主题的信息吗?还是我找错地方了,这是另一个内存问题吗?我希望有人能指出我正确的方向。
如果需要更多信息,我很乐意提供。注意:我不是在寻找使用 JSONKit 或其他库来替换 rapidjson 的答案。谢谢 :)