Bus error vs Segmentation fault

葛子昂
2023-12-01

    这两天遇到了这两个别头疼的事情,程序一会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的发生。此发生和你是用的平台和方位的地址有很大的关系,所以这个需要看下执行文件的相关信息。


 类似资料:

相关阅读

相关文章

相关问答