博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
crash:EXC_ARM_DA_ALIGN(关于内存对齐,memcpy)
阅读量:4122 次
发布时间:2019-05-25

本文共 1431 字,大约阅读时间需要 4 分钟。

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 发现原来是跟字节对齐有关,下面是几篇不错的文章:

(第四条)

作者们都提到了使用 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*转换,强制使用老版本。参考:


转载地址:http://yhtpi.baihongyu.com/

你可能感兴趣的文章
Ribbon 学习(二):Spring Cloud Ribbon 加载配置原理
查看>>
Ribbon 学习(三):RestTemplate 请求负载流程解析
查看>>
深入理解HashMap
查看>>
XML生成(一):DOM生成XML
查看>>
XML生成(三):JDOM生成
查看>>
Ubuntu Could not open lock file /var/lib/dpkg/lock - open (13:Permission denied)
查看>>
collect2: ld returned 1 exit status
查看>>
C#入门
查看>>
C#中ColorDialog需点两次确定才会退出的问题
查看>>
数据库
查看>>
nginx反代 499 502 bad gateway 和timeout
查看>>
linux虚拟机安装tar.gz版jdk步骤详解
查看>>
python猜拳游戏
查看>>
python实现100以内自然数之和,偶数之和
查看>>
python数字逆序输出及多个print输出在同一行
查看>>
苏宁产品经理面经
查看>>
百度产品经理群面
查看>>
去哪儿一面+平安科技二面+hr面+贝贝一面+二面产品面经
查看>>
element ui 弹窗在IE11中关闭时闪现问题修复
查看>>
vue 遍历对象并动态绑定在下拉列表中
查看>>