bus error(总线错误)

转自  http://blog.csdn.net/todd911/article/details/8813321

在《C专家编程》中提到了总线错误bus error(core dumped)。

总线错误几乎都是由于未对齐的读或写引起的。

它之所以称为总线错误,是因为出现未对齐的内存访问请求时,被堵塞的组件就是地址总线。对齐的意思就是数据项只能存储在地址是数据项大小的整倍数的内存位置上。

现代的计算机架构中,尤其是RISC架构,都需要字对齐,因为与任意的对齐有关的额外逻辑都会使内存系统更大且更慢。

通过迫使每个内存访问局限在一个cache行或者一个单独的页面内,可以极大地简化(并加速)如cache控制器和内存管理单元这样的硬件。

页和cache的大小都是经过精心设计的,这样只要遵守对齐规则就可以保证一个原子数据项不会跨过一个页或cache块的边界。

书中还给出了总线错误的例子:

[cpp] view plaincopy

  1. union
  2. {
  3. char a[10];
  4. int i;
  5. }u;
  6. int *p =(int*)&(u.a[1]);
  7. *p =17;/*p中未对齐的地址将会引起总线错误,因为数组和int的联合确保了a是按照int的4字节来对齐的,所以“a+1”肯定不是int来对齐的。*/

但是在实际的运行中并没有出现该错误,我的环境是CentOS release 6.2,2.6.32-279.14.1.el6.i686,gcc 4.4.6

后来在网上参考了一个sample程序,将程序修改为如下:

[cpp] view plaincopy

  1. #include <stdlib.h>
  2. int main(int argc, char **argv) {
  3. #if defined(__GNUC__)
  4. # if defined(__i386__)
  5. /* Enable Alignment Checking on x86 */
  6. __asm__("pushf\norl $0x40000,(%esp)\npopf");
  7. # elif defined(__x86_64__)
  8. /* Enable Alignment Checking on x86_64 */
  9. __asm__("pushf\norl $0x40000,(%rsp)\npopf");
  10. # endif
  11. #endif
  12. union{
  13. char a[10];
  14. int i;
  15. }u;
  16. int *p =(int*)&(u.a[1]);
  17. *p =17;
  18. }

运行结果如下:
Bus error (core dumped)

原因是:

x86体系结构会把地址对齐之后,访问两次,然后把第一次的尾巴和第二次的头拼起来。

如果不是x86,那种体系结构下的机器不肯自动干这活,就会产生core。

如果在代码中将对齐检查功能打开,运行后能显示bus error

时间: 2024-10-05 11:03:57

bus error(总线错误)的相关文章

segmentation fault和bus error&lt;core dump&gt;错误分析

segmentation fault:段错误 一般有以下原因容易造成段错误: 1)指针: 指针为空"NULL",或者指针未初始化就使用,指针使用完后未释放 2)内存(超出分配的内存空间): 对数组操作不当,数组越界:对字符串操作不当(比如在使用strcpy函数时),字符串空间越界:对动态内存操作不当,内存越界 bus error:总线错误 此类错误目前遇到的情况都是因为内存未对齐造成的,内存对齐问题经常发生在嵌入式中,因为跟平台相关. 内存对齐问题 1)数组(或者数组元素)的数据类型强

QT程序出现Bus Error问题的调试

原文 1.文档目的 本文档目的在于探究部分QT程序在嵌入式板子上出现BusError问题的调试及解决方法: 以数码相框程序出现的BusError为例: 2.原因分析 2.1产生BusError的可能原因: BusError即总线错误,BusError通常都是因为非对齐访问造成的.CPU在设计上为了性能上的考虑,要求待访问,操作的数据地址都要对齐.如果发现没有对齐的访问,就会向当前进程发出SIGBUS信号,使程序崩溃.RISC包括MIPS都是这种类型的芯片.而X86架构就没有这种对齐要求.所以代码

飞鸽传书 bind() error=10048错误的解决方法

提示  bind() 错误=10048 原因:其他程序占用飞鸽的 2425 端口 比如:飞秋也是使用2425端口 解决:用netstat命令查看是哪个进程占用了该端口 格式:netstat -ano | find "2425" 结果:  UDP    0.0.0.0:2425     *:*        1716 最后的1716就是占用2425进程的进程ID,看看是什么,可以结束的直接结束该进程,再打开飞鸽就可以了. 关于netstat命令可以输入命令 netstat /? 查看更多

jQuery上传插件Uploadify出现Http Error 302错误解决

前段时间介绍过jquery uploadify上传插件的使用方法,我在使用中遇到过Http Error 302错误问题,应该会有很多人在使用中遇到过,在此记录下来: 首 先http 302是请求被重定向的意思,这就很容易理解了,如果你的uploadify处理上传脚本有session验证,就会出现此错误,因为flash在执行 post请求的时候没有包含cookie信息,而服务器的session会根据客户端的cookie来得到SESSIONID.没有提交cookie自然 就不能获取到session,

VMware vCenter Server Appliance Error: VPXD错误

最近发现有的时候在配置VCenter(OVF)的时候,有的时候会出现 Erro:VPXD must be stopped to perform this operation 这个错误,提示就是让我关掉这个VPXD服务. 这种错误以前偶尔出现,但是新版本中不知道为什么经常出现,后来发现如果想去掉这个错误就必须关掉这个服务,你的VCenter才能生效. 解决办法只有先关掉VCenter的所有服务. 然后进入的VCenter服务界面后才能关闭VPXD这个服务. 首先要登陆到Linux界面然后输入用户名

Socket程序中的Error#10054错误

近期使用winSock做的一个网络项目中,使用TCP+Socket连接编写的一个多线程的网络程序,功能是client负责不断地向server端发送数据,服务端负责接收数据.client是一个DLL,服务端程序是一个随机启动的NT Service服务程序. 程序在夜间无人操作的执行过程中,client常常不定时地出现错误号为:10054的错误,而server端并没有对应的提示.执行环境是win2000+sp4,这个问题出现得比較莫名其妙. 查了MSDN上的10054错误号说明:WSAECONNRE

XCODE 出现 The operation couldn&#39;t be completed.(LaunchServicesError error 0.)错误修复

今天在利用XCode开发苹果APP时想使用脚本来存储一些语言文字信息,在完成环境配置和搭建以后调用Lua脚本成功.但是该Lua脚本把所有的内容都包含在一起,不太符合文件独立的要求,就把文件拆成了两部分,通过include之类的Lua关键字进行关联.调整完毕以后运行调试,出现了Lua引擎无法搜索到被包含的脚本的错误,于是就开始折腾了,一会用相对包含关系包含文件,一会又用文件引用方式使用文件,最终问题没有得到解决但是出了一个新问题对比了工程版本修改记录也没发现问题原因,求助了万能的百度(吐啊吐啊~~

新浪微博 IOS sso package or sign error 和 error:redirect_uri_mismatch 错误解决方法

在新浪微博 开发平台 申请一个客户端应用  应用名称和应用地址 可以随便填写 创建之后 除了 要把 BundleId 项 与 你的工程Bundleid 保持一致外 其他随便填写 如果不一致 将导致  sso package or sign error 错误 授权回调页  填写 http://open.weibo.com/apps/APPKey/info/advanced  其中 APPKey 为 你申请到得 appkey 在应用程序中 也要设置这个 重定向地址 即WBAuthorizeReque

解决SQL Server管理器无法连接远程数据库Error: 1326错误

解决SQL Server管理器无法连接远程数据库Error: 1326错误 我们在在使用SQL Server时都会遇到使用SQL Server Management Studio无法连接远程数据库实例的问题,错误描述信息摘录如下: An error has occurred while establishing a connection to the server. (provider: Named Pipes Provider, error: 40 – Could not open a con