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的结果往往都比你声明的 ...
随机推荐
- List的 并集、交集、差集操作
package com.zheting.collection.list; import java.util.ArrayList; import java.util.Arrays; import jav ...
- 【深入理解JVM】:Java内存模型JMM
多任务和高并发的内存交互 多任务和高并发是衡量一台计算机处理器的能力重要指标之一.一般衡量一个服务器性能的高低好坏,使用每秒事务处理数(Transactions Per Second,TPS)这个指标 ...
- 【转】Spring Boot特性
https://yq.aliyun.com/articles/25530 摘要: 1. SpringApplication SpringApplication 类是启动 Spring Boot 应用的 ...
- spring注入bean的三种方法
在Spring的世界中, 我们通常会利用bean config file 或者 annotation注解方式来配置bean. 在第一种利用bean config file(spring xml)方式中 ...
- 【题解】洛谷P1514 [NOIP2010TG] 引水入城(DFS+DP)
次元传送门:洛谷P1514 思路 可以证明如果有解 那么每个蓄水池可以覆盖到的干旱区必定是线段 证明: 举个栗子 8 9 8 7 9 7 6 9 6 明显到不了中间的点 如果不是连续的线段 中间肯定有 ...
- webservice 从客户端中检测到有潜在危险的 Request.Form 值
webservice中传递xml格式的参数时报错 webservice 从客户端中检测到有潜在危险的 Request.Form 值解决方案: 1.在web.config的system.web节点中添加 ...
- C#制作ActiveX浏览器插件.net
开发环境:VS2008 第一步 创建项目 新建一个项目,选择“Windows窗体控件库”,创建一个用户控件项目“ActiveXDemo”(注意,这里起名不能用中文,否则后面会出问题),里面有个用户控件 ...
- 使用BSRR和BRR寄存器直接操作STM32的I/O端口
STM32的每个GPIO端口都有两个特别的寄存器,GPIOx_BSRR和GPIOx_BRR寄存器,通过这两个寄存器可以直接对对应的GPIOx端口置'1'或置'0'. GPIOx_BSRR的高16位中每 ...
- qsort()与sort的用法(收藏)
sort()函数是C++中的排序函数其头文件为:#include<algorithm>头文件: qsort()是C中的排序函数,其头文件为:#include<stdlib.h> ...
- ECS centos6.8系统下从nginx安装到简单网站上线配置操作的完整记录
1.准备工作 1.1已购买阿里云云服务器ECS 1.2域名已购买并解析成功 1.3安装有远程链接工具Xshell和文件传输工具Xftf,并链接上ECS实例 2.安装nginx(在Xshell操作) 2 ...