文档章节

sigbus内存错误

梦想游戏人
 梦想游戏人
发布于 2017/05/13 19:10
字数 328
阅读 454
收藏 0

编写跨平台代码时,ARM不支持非对齐的内存访问,x86支持,跨平台C++代码容易出现以下问题

sigbus意思是该地址有效,但是总线不能读取,具体错误信息有以下三种

BUS_ADRALN 未对齐的内存

BUS_ADRERR 不存在的物理地址

BUS_OBJERR 硬件错误

 

BUS_ADRALN 一般是类型转换导致的,比如

由于对齐,多出来的3个字节并没有初始化为0,ptr1按照int来解析内存,能顺利读取到后面3个字节,因为内存是合法的,虽然数据不对,但是对于没有对齐的话,那么按照ptr1的地址解析int 就会出错,因为虽然ptr1指针的地址是合法的,但是只有一个字节,并没有多出3个字节。如果CPU支持非对齐内存的访问的话,把3个字节当做0处理即可,但是部分ARM系列并不支持。这类代码编写跨平台就很容易BUG。

这种问题的解决方案之一是,用sizeof 和 char*最小的 基本数据内存块来对内存解析,

简单粗暴就是memcpy(..,..,sizeof(...));这样一个字节一个字节地拷贝到副本里面

 

又比如

 

 

 

© 著作权归作者所有

共有 人打赏支持
梦想游戏人
粉丝 35
博文 435
码字总数 123998
作品 0
成都
私信 提问
ios开发之crash日志收集,以及分析

在ios开发过程,当应用已经打包,iPhone设备通过ipa的包安装应用后,在使用过程发现crash,那么如何获取crash日志呢,现提供如下四种获取crash日志的方式: 1、打开iPhone设备的设置里面的隐私...

HillYoung
2015/03/16
0
0
【PHP】如何优雅的杀死PHP的死循环(常驻进程)

在日常开发的过程中,遇到一个问题,就是 有这么一个常驻进程,每隔6秒,干一些事情,这个时候,突然出了一些意外状况或者要迭代版本,得先给这个进程停掉,打断循环退出。如果直接kill掉,那...

qq_28602957
2017/10/31
0
0
LINUX 信号概念详解

LINUX 信号概念详解 我们运行如下命令,可看到Linux支持的信号列表: # kill -l1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE9) SIGKILL 10) SIGUSR1......

crushlinux
2014/05/15
0
0
linux的运维管理UNIT7

################## ### 进程的定义 ### ################## 触发任何一个事件时,系统都会将它定义成为一个进程,并且给予这个进程一个ID,称为PID。 进程就是CPU未完成的工作 *)区别程序和...

季凉末一
2017/05/10
0
0
Linux getrlimit和setrlimit函数

表头文件:#include <sys/resource.h> 定义函数:

吃一堑消化不良
2016/11/02
33
0

没有更多内容

加载失败,请刷新页面

加载更多

HashTable和Vector为什么逐渐被废弃

HashTable,不允许键值为null,还一个就是put方法使用sychronized方法进行线程同步,单线程无需同步,多线程可用concurren包的类型。 如编程思想里面说的作为工具类,封闭性做的不好没有一个...

noob_chr
昨天
0
0
Win10 下安装Win7双系统

很多人买了预装64位Win8/8.1的电脑后想重装(或者再安装一个)Win7系统,但是折腾半天发现以前的方法根本不奏效。这是因为预装Win8/8.1的电脑统一采用了UEFI+GPT引导模式,传统的BIOS(Legacy...

yaly
昨天
1
0

中国龙-扬科
昨天
1
0
假若明天来临——《AI.未来》读后感3900字

假若明天来临——《AI.未来》读后感3900字: 你有没有想过,如果有一天你被确诊为癌症患者,你会做些什么?你有没有想过,在你百年之后,你希望你的墓碑上刻写着什么内容? 在我翻开李开复老...

原创小博客
昨天
1
0
tomcat线程模型

Connector结构 BIO模式 NIO模式

grace_233
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部