Bus error vs Segmentation fault

    这两天遇到了这两个别头疼的事情,程序一会Seg ,一会Bus。度娘了下,没有啥特别的解释,这边在StackOverflow看到了几篇相关的讨论,觉得还是不错。

    两者的区别(我觉得英文比中文看起来更好理解):

    Bus Error: it usually means that you are trying to access memory that does not exist (e. g. you try to access an address at 12G but you only have 8G memory) or if you exceed the limit of usable memory

    Segmentation fault:it  means that you are trying toaccess memory that you are not allowed to (e. g. it's not part of your program).

    知道两者的区别,并且知道怎么引起了两者的发生。一下可以测试两者的用例,并且知道Bus Error 用SIGBUS 、Segmemtation Fault 用SIGSEGV。以下是用例
#include <signal.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>

int main()
{
        srand(time(NULL));
        if(rand() % 2)
                kill(getpid(), SIGBUS);
        else
                kill(getpid(), SIGSEGV);
        exit(0);
}
   运行之后,就知道什么时候发生了。具体的问题定位,可以看下调用栈,所使用的库文件,执行文件。另外Bus Error看下平台是否正确,硬件版本,驱动问题等。这里只提供这么多,后期如果还有其他,会继续更新。

  看了斯坦福大学教授讲的实在是让我醍醐灌顶,这边在更新一下两者的分配。

   Seg Error 是指在程序的分配中,我们知道有代码段,stack,heap,数据段,最后一个0地址。而当我们发生SegError时,是我们访问了不属于以上的段,访问了0这个最为底层的地址。而此地址并没有映射到我们的执行程序之中,导致了Seg Error.

   Bus Error是指程序在访问地址的时候,只能按某种字节去访问。如你的设备只能是访问四字节的偶数地址,而你访问了基数地址,从而导致了BusError的发生。此发生和你是用的平台和方位的地址有很大的关系,所以这个需要看下执行文件的相关信息。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值