Ubuntu/linux c开发(8)总线错误

最近在搬砖过程中遇到一个非常蛋疼的问题,我调试程序没有任何问题,但是直接执行可执行文件直接提示:总线错误
在这里,我把我遇到的情况和最终找到的问题贴出来,希望大家以后遇到这种问题能有解决思路。

1、环境

现场环境:

Linux localhost.localdomain 4.19.90-24.4.v2101.ky10.aarch64 #1 SMP Mon May 24 14:45:37 CST 2021 aarch64 aarch64 aarch64 GNU/Linux

编译环境:

x86 arm g++;

需要注意的是,我的系统是基于ARM的。

2、错误结构体

typedef struct  mySendInfo
{
	bool bInRedis;
	char cSendRecv;
	int  nDstPort;
	char szPktType[12];
	char szChnlNo[12];
	char szDstIP[32];
	char szSeqno[32];
	char szClientIP[32];
}StuSendInfo;

看上去没问题,实际在x86上运行也没有问题,那么问题在哪里?

	bool bInRedis;
	char cSendRecv;
	int  nDstPort;

什么问题?字节对齐 ,是的,就是字节对齐。arm相比x86, 对于x86平台,是默认允许非对齐访问的。
因为结构体变量StuSendInfo的成员cSendRecv的地址是不对齐的地址。CPU访问地址要求是四字节对齐,访问了*(addr+0x001)就会引发异常。

3、解决方法

我使用了比较笨的办法,直接修改了成员的类型。算是比较暴力的了,如果各位同学有好办法请私我。

typedef struct  mySendInfo{
	int	bInRedis;
	char cSendRecv[4];
	int  nDstPort;
	char szPktType[12];
	char szChnlNo[12];
	char szDstIP[32];
	char szSeqno[32];
	char szClientIP[32];
}StuSendInfo;

4、 其他几个会导致总线错误的原因

1、物理问题
机器的内存大小不够了;
执行df -lh命令,查看设备的磁盘使用率。如果真的是这个问题,清理内存就OK;

2、强转赋值

	short array[16];
 	int * p = (int *) &array[1];

short类型大小为2个字节,其地址必是2的倍数。而对于int指针来说,能够使用以访问数据的地址应该是4的倍数,转化arrary[1]的地址为int *并访问,系统会发出SIGBUS信号,导致程序崩溃。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值