首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不良内存对齐iOS

不良内存对齐iOS
EN

Stack Overflow用户
提问于 2013-09-13 06:49:43
回答 2查看 908关注 0票数 2

我被困在以下坠机报告中:

代码语言:javascript
复制
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来寻找答案。谢谢:)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-14 00:40:25

这个问题以前曾在这里讨论过:https://devforums.apple.com/message/807860

简而言之,最初的Objective异常已经被释放了(例如,由一个自动释放池),然后它被取消引用在未命名的异常处理程序中。因此,__handleUncaughtException()将取消一个已死指针,然后在异常处理程序中看到崩溃。

票数 2
EN

Stack Overflow用户

发布于 2013-09-13 15:07:43

首先,地址0xa0000008看起来没有错对,SEGV_ACCERR并不意味着对齐问题,而是内存访问权限问题(来自sys/signal.h):

代码语言:javascript
复制
#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()

因此,您可能需要首先找出主要错误,例如从异常日志中(在许多情况下仅进行回溯跟踪是不够的)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18779966

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档