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

本文共 1485 字,大约阅读时间需要 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*转换,强制使用老版本。**参考:


转载于:https://www.cnblogs.com/songcf/p/4990760.html

你可能感兴趣的文章
sql serve 创建序列
查看>>
模型层的生成
查看>>
关于APP接口设计
查看>>
【VI】如何再执行上一个(历史)命令(已解决)
查看>>
KendoUI系列:DropDownList
查看>>
Axure7.0汉化方法
查看>>
我的MYSQL学习心得(九)
查看>>
JavaScript高级程序设计学习笔记--DOM
查看>>
Python易学就会(五)turtle绘制椭圆与递归
查看>>
echarts map地图设置外边框或者阴影
查看>>
使用vue-cli脚手架+webpack搭建vue项目
查看>>
Docker - 03 编排容器 Docker Compose 指令速查表
查看>>
Mybatis基本映射--INSERT
查看>>
手把手教你理解卷积神经网络
查看>>
猴子都能看懂的《Git 分支管理》
查看>>
【面试算法】链表反转
查看>>
镭速(Raysync)文件传输高可用安装部署介绍!
查看>>
使用 Jaeger 完成服务间的链路追踪
查看>>
Java NIO使用及原理分析 (一)
查看>>
为什么企业不对 GPL 侵权采取法律行动
查看>>