问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Bus Error怎么解决?

发布网友 发布时间:2023-12-30 10:01

我来回答

1个回答

热心网友 时间:2024-12-05 02:22

最近在论坛上看到一个程序员在询问Bus Error的问题。他有一个非常简单的测试程序,将一个short数组中第二个成员变量的地址附给一个int型的指针,接着给该指针赋值,大致代码如下:
short array[10];
int * p = (int *) &array[1];*p = 1;
运行的平台是Solaris for SPARC,使用的编译器是GCC,程序执行到指针赋值的时候的出现Bus Error出错信息,程序coremp。他觉得非常奇怪,代码在X86平台运行的很好。其实这个问题完全是由于CPU硬件不同所造成的。
Bus Error通常都是因为非对齐访问造成的。CPU在设计上为了性能上的考虑,要求待访问,操作的数据地址都要对齐。如果发现没有对齐的访问,就会向当前进程发出SIGBUS信号,使程序崩溃。RISC包括SPARC都是这种类型的芯片。而X86架构就没有这种对齐要求。所以这段代码在Solaris 10 for X86下面没有问题,当然这是有性能的代价。Bus Error也有可能是因为机器物理问题或者访问无效物理地址,但这种情况非常少见。
上面的代码正是这种非对齐访问造成的Bus Error。short是两个字节,其地址偏移量必是2的倍数。而对于int指针来说,需要偏移量地址是4的倍数的数据,所以直接用int指针来操作地址,就很有可能导致系统发出SIGBUS信号,程序崩溃。
这段程序如果用Sun Studio编译器的话,运行就没有问题。这是因为Sun Studio默认对32位编译使用的参数是-xmemalign=8i,其中i选项设置明确不会产生这种SIGBUS信号。不过如果编译成64位程序,Sun Studio使用的-xmemalign=8s,其中s选项设置意味对这种非对齐访问产生SIGBUS信号,仍旧会遇到这个错误。
当然你也可以坚持在SPARC上使用GCC去编译这种代码。GCC有一个Type Attributes特性,在需人工对齐的变量后加上:__attribute__ ((aligned (4))); 4就是指定偏移量。比如:
short array[10] __attribute__ ((aligned (4)));
不过这个属性只对Linker连接器可见的变量有效,也就是说对local variable无效。而且这种特性只能照顾到该数组,即第一个元素,并不为数组的每个成员设置偏移量。
如果一定要针对local variable或者数组的每个成员进行偏移量设置,可以考虑定义一个union的类型:union {short s;int i;}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
"你是在哪看到我的照片?"怎么说英语 留恋地看着我的照片用英语怎么说? 高德iphone地图下载 苹果手机高德地图怎么下载地图 孕中期适合出游吗 哪些孕妇不适合长途旅行 孕妇坐长途车旅行的好处 孕妇出游的最佳时间 孕晚期适合出游吗 孕妇外出旅行禁忌 小米11烧wifi啥表现 未满一年可以强制改吗 手机百度地图设置了中转站 但是保存不了 求解 微信分身怎么注册第二个? 偶像来了刘嘉玲和小哥唱的歌叫什么名字 成语升斗小民的解释 新怎么养号的最新相关信息120 好听的大全77 地理 图中比例尺哪个大 升斗小民是什么动物 新注册的怎么养不会被封87 ...降到300!请问当天早晨打了升白细胞的针晚上能做放疗吗? 直系亲属可以代领工资吗 没到一年时间怎么改? 魔兽世界单人进团队副本 生命充实是一种怎样的体验? 亚洲第一毒蛇是什么蛇 英语作文,你最喜欢的科目是什么?你是怎样学习它的,当你遇到困难你像谁... 交通银行的银行都有哪些优惠?有哪些优惠? 比例尺的大小比较(地理)??? ...能嫁到有地位有经验的人吗。长相可以,你们说可能吗 为什么开机蓝屏的,进不了系统 英语作文《介绍你喜欢的学科》加翻译(为什么喜欢,是怎么学习这科的... 步步惊情16集 17集 18集 百度影音什么时候更新? 外国的一个四肢残疾人、经常对外演讲,感动了许多人。谁知道他叫什么名字... 胸肌和手臂肌肉,练完要休息多久 一个手机号怎么申请第二个? 如何强制二次修改? 步步惊心哪集播放行到水穷处坐看云起时 养老储蓄是什么意思 为什么有时会有莫名其妙的失落感,心里很难受,没有安全感 就好像全 经常情绪低落,整个人萎靡不振,觉得未来没有希望,有时候会莫名其妙 鸭的肝是绿色的,可以吃吗 - 百度 怎样用手机申请881 微信手机号在24小时内,已绑定两个,已达到限制,不能在绑定其他微信... 步不惊情一共多少集 计算机2级的photoshop过了能不能再考VFox??肯定答案的才好回答,不肯定... 无法保存到中转站 怎么办、? 拳击散打武术哪个厉害,中国武术散打十大名将,有几 养老金账户开了就得存吗 我今天开机清灰,清灰之前一切正常,清灰过后,显示屏一直显示无信号,怎 ...