我被困在以下坠机报告中:
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 (来自测试版测试人员的临时构建)接收这个崩溃日志。不同的异常代码从SIGSEGV/SEGV_ACCERR到SIGBUS/BUS_ADRALN到EXC_BAD_ACCESS/KERN_INVALID_ADDRESS不等。
我使用rapidjson图书馆 on iOS (armv7和armv7s)和填充修复(如描述的这里(#8) ),并使用objective运行时函数在运行时添加方法实现(使用class_addMethod)。
我们的代码库主要存在一些Obj++和一些C代码的目标C代码.内存管理是由ARC完成的,只有Obj++和C部分是手动处理的。我查看了每个malloc/free调用,并且广泛地使用libgmalloc来确定内存问题,但是没有什么是不正确的。
我无法自己复制这个崩溃日志,而不是在调试或发布模式下,但是我们的beta测试人员不时地给我发送这个崩溃日志(大约50次运行中就有1次)。由于我们的产品(希望)不久将在许多iOS设备上运行,这是我们不能留下的坏消息。
在阅读了大量内存管理文章之后,我怀疑这个问题是由内存对齐不良引起的。因此,我怀疑rapidjson是引起这一错误的原因。我对iOS / armv7上的内存对齐缺乏了解,因此无法修复这个崩溃日志。有人能在iOS上解释一下这个问题吗?还是我找错地方了,这是另一个记忆问题吗?我希望有人能给我指明正确的方向。
如果需要更多的信息,我很乐意提供它。注意:我并不是在使用JSONKit或其他库来代替rapidjson来寻找答案。谢谢:)
发布于 2013-09-14 00:40:25
这个问题以前曾在这里讨论过:https://devforums.apple.com/message/807860
简而言之,最初的Objective异常已经被释放了(例如,由一个自动释放池),然后它被取消引用在未命名的异常处理程序中。因此,__handleUncaughtException()将取消一个已死指针,然后在异常处理程序中看到崩溃。
发布于 2013-09-13 15:07:43
首先,地址0xa0000008看起来没有错对,SEGV_ACCERR并不意味着对齐问题,而是内存访问权限问题(来自sys/signal.h):
#define SEGV_ACCERR 2 /* [XSI] invalid permission for mapped object */考虑到您正在使用class_addMethod(),并且崩溃是在_cache_getImp()中进行的,这是检索方法的一部分,我基本上没有根据地怀疑您向class_addMethod()传递了一些无效的指针,或者稍后重写了这些信息。
要检查的是您是在使用全局内存还是使用malloc()ed内存,因为运行时函数不会为您复制。
其次,您所看到的崩溃是次要的,您在运行顶级异常处理程序时崩溃,该异常处理程序已经从早期的异常终止(_objc_terminate()),但在本例中,它不是Unix信号,而是一个目标C异常:objc_exception_rethrow()。
因此,您可能需要首先找出主要错误,例如从异常日志中(在许多情况下仅进行回溯跟踪是不够的)。
https://stackoverflow.com/questions/18779966
复制相似问题