crash:EXC_ARM_DA_ALIGN(关于内存对齐,memcpy)
crash:EXC_ARM_DA_ALIGN(关于内存对齐,memcpy)
问题描述
在iOS game开发时做内存拷贝时出现了 crash:EXC_ARM_DA_ALIGN,debug版本不会出现,release版本只在部分机器上出现(ipad 1(iOS7),ipod touch 5(iOS7,iOS8), iphone5c(iOS9)).
所以初步猜想是release编译优化导致的,从crash日志中只看到是某个函数,无法定位在哪一行代码,所以就添加日志后重新release,主要代码如下:
uint32_t scriptLen = *(uint32_t*)(pScriptBegin);
uint32_t prologLen = *(uint32_t*)(pScriptBegin + 4);
uint32_t scriptVer = *(uint32_t*)(pScriptBegin + 8);
jzyx::Logger::getInstance()->onInfo(StringUtils::format("sl,pl,sv = [%u, %u, %u]", scriptLen, prologLen, scriptVer).c_str());
uint32_t checkCode = scriptLen + prologLen + scriptVer;
uint32_t codePos = floor(scriptLen * 0.6);
uint32_t readCode = *(uint32_t*)(pScriptBegin + codePos);
jzyx::Logger::getInstance()->onInfo(StringUtils::format("cc,cp,rc = [%u, %u, %u]", checkCode, codePos, readCode).c_str());
然后加入两行日志后release也不崩溃了。。。更加相信是编译器优化导致
字节对齐
后来搜索了一下 EXC_ARM_DA_ALIGN 发现原来是跟字节对齐有关,下面是几篇不错的文章:
http://www.cnblogs.com/zouzf/p/4455167.html
http://justinyan.me/post/1609 (第四条)
http://discuss.cocos2d-x.org/t/problems-with-exc-bad-access-in-ccbreader/4502
作者们都提到了使用 memcpy 替换我上面的赋值代码,替换之后 release 版本确实不再出现 EXC_ARM_DA_ALIGN。代码如下:
uint32_t scriptLen, prologLen, scriptVer;
memcpy((void*)&scriptLen, (const void*)pScriptBegin, 4);
memcpy((void*)&prologLen, (const void*)(pScriptBegin + 4), 4);
memcpy((void*)&scriptVer, (const void*)(pScriptBegin + 8), 4);
uint32_t codePos = floor(scriptLen * 0.6);
uint32_t readCode;
memcpy((void*)&readCode, (const void*)(pScriptBegin + codePos), 4);
使用 memcpy 还不够,说不定你在xcode6打包的ok,但是xcode7就会crash。因为 memcpy 有多个版本,不同的xcode版本优化也不一样,需要将参数加上void*转换,强制使用老版本。参考:How do the ARM Compilers handle memcpy()?
crash:EXC_ARM_DA_ALIGN(关于内存对齐,memcpy)的更多相关文章
- C++成员变量内存对齐问题,ndk下非对齐的内存访问导致BUS_ADRALN
同样的代码,在vs下运行正常,在android ndk下却崩溃: signal 7(SIGBUS),code 1 (BUS_ADRALN),fault addr 0xe6b82793 Func(sho ...
- C++内存对齐总结
大家都知道,C++空类的内存大小为1字节,为了保证其对象拥有彼此独立的内存地址.非空类的大小与类中非静态成员变量和虚函数表的多少有关. 而值得注意的是,类中非静态成员变量的大小与编译器内存对齐的设置有 ...
- C/C++: C++位域和内存对齐问题
1. 位域: 1. 在C中,位域可以写成这样(注:位域的数据类型一律用无符号的,纪律性). struct bitmap { unsigned a : ; unsigned b : ; unsigned ...
- C/C++ 知识点1:内存对齐
预备知识:基本类型占用字节 在32位操作系统和64位操作系统上,基本数据类型分别占多少字节呢? 32位操作系统: char : 1 int :4 short : 2 unsigned ...
- Windows+GCC下内存对齐的常见问题
结构/类对齐的声明方式 gcc和windows对于modifier/attribute的支持其实是差不多的.比如在gcc的例子中,内存对齐要写成: class X { //... } __attrib ...
- c++内存对齐
内存对齐原则: 1.数据成员对齐规则:struct, union的数据成员,第一个数据成员放在offset为0的地方,之后的数据成员的存储起始位置都是放在该数据成员大小的整数倍位置.如在32bit的机 ...
- C语言中内存对齐
今天一考研同学问我一个问题,一个结构体有一个int类型成员和一个char类型成员,问我这个结构体类型占多少个字节,我直接编个程序给他看结果.这个结构体占八个字节,咦,当时我蛮纳闷的,一个int类型四个 ...
- 内存对齐 和 sizeof小结
数据对齐(内存对齐)指该数据所在的地址必须是该数据长度的整数倍.X86CPU能直接访问对齐的数据,当它试图访问未对齐的数据时,会在内部进行一系列的调整,降低运行速度.数据对齐一般出现在结构体和类中,在 ...
- 解析C语言结构体对齐(内存对齐问题)
C语言结构体对齐也是老生常谈的话题了.基本上是面试题的必考题.内容虽然很基础,但一不小心就会弄错.写出一个struct,然后sizeof,你会不会经常对结果感到奇怪?sizeof的结果往往都比你声明的 ...
随机推荐
- 国外优秀JavaScript资源推荐
JavaScript的优秀资源 原文链接:http://code.tutsplus.com/articles/resources-for-staying-on-top-of-java ...
- 小知识积累-linux下一些简单开发配置
系统环境为 redhat enterprise 6.x,主要是针对初学者在linux下用gcc和vi简单测试开发的一些配置 1.vi 自动换行 在终端下敲入vi命令打开文件 : vi ~/.vimrc ...
- 理解JavaScript执行环境与作用域
执行环境定义了变量或函数有权访问的其他数据,决定了它们的各自行为.每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中,虽然我们无法访问这个对象,但是解析器在处理数据时 ...
- java两种反射的区别 - Class.forName()和ClassLoader.loadClass()
在理解这两种反射机制之前,需要弄清楚java类的加载机制. 装载:通过类的全限定名获取二进制字节流(二进制的class文件),将二进制字节流转换成方法区中的运行时数据结构,在内存中生成Java.lan ...
- TCP-IP and Advanced Topics 课程总结与报告
课程总结 学习了四周十六课的课程,对每一课的知识点进行总结梳理,作出一个树状的知识网络图. 本课程虽然在深度上有所欠缺,但却更有利于结构上的梳理,加深总体上对网络的理解. 本课程从Internet出发 ...
- Entity Freamwork CodeFirst 连接PostgreSql数据库
EF的Code First是一个比较强大也比较有用的功能,他可以让你先写代码,最后根据代码去生成数据库,非常符合OO设计的要求,抛开数据库层面不管(当然不是完全的不管),只管对象的设计. 首先,说一下 ...
- ubuntu server遇到的问题
1.在呢用is把隐藏的文件显示出来: ls -a 就可以啦 2.vim退出: 在命令模式中,连按两次大写字母Z,若当前编辑的文档曾被修改过,则Vi保存该文档后退出,返回到shell:若当前编辑的文档没 ...
- centos安装hadoop(伪分布式)
在本机上装的CentOS 5.5 虚拟机, 软件准备:jdk 1.6 U26 hadoop:hadoop-0.20.203.tar.gz ssh检查配置 [root@localhost ~]# ssh ...
- HDBS之应用代码优化
一.目录结构树 总体概述 代码检测工具sonar HDBS代码优化 总结开发注意点 二.总体概述 进入现在这家公司我的第一个任务就是对HDBS进行代码质量优化.HDBS可能大家不是很了解,现在给大家简 ...
- iOS小知识点
1.子视图超出frame的部分不显示 view.clipsToBounds 设置为YES; UIScrollview的clipsToBounds默认就是YES 2.UIImage 有一个属性叫s ...