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