首页 > 代码库 > SIGBUS 和 SIGSEGV

SIGBUS 和 SIGSEGV

一、导致SIGSEGV 
    1.试图对只读映射区域进行写操作 。

    2.访问的内存已经被释放,也就是已经不存在或者越界。

3.官方说法是:
SIGSEGV --- Segment Fault. The possible cases of your encountering this error are: 

(1)buffer overflow --- usually caused by a pointer reference out of range.
(2)stack overflow --- please keep in mind that the default stack size is 8192K.
(3)illegal file access --- file operations are forbidden on our judge system.

 

二、导致SIGBUS信号: 
    1.硬件故障,不用说,程序员最常碰上的肯定不是这种情形。 

    2.Linux平台上执行malloc(),如果没有足够的RAM,Linux不是让malloc()失败返回, 而是向当前进程分发SIGBUS信号。 

       注: 对该点执怀疑态度,有机会可自行测试确认当前系统反应。 

    3.某些架构上访问数据时有对齐的要求,比如只能从4字节边界上读取一个4字节的 数据类型。IA-32架构没有硬性要求对齐,尽管未对齐的访问降低执行效率。另外一些架构,比如SPARC、m68k,要求对齐访问,否则向当前进程分发SIGBUS信号。 

    4.试图访问一块无文件内容对应的内存区域,比如超过文件尾的内存区域,或者以前有文件内容对应,现在为另一进程截断过的内存区域。


三、SIGBUS与SIGSEGV信号一样,可以正常捕获。SIGBUS的缺省行为是终止当前进程并产生core dump。 


四、SIGBUS与SIGSEGV信号的一般区别如下: 

    1.SIGBUS(Bus error)意味着指针所对应的地址是有效地址,但总线不能正常使用该指针。通常是未对齐的数据访问所致。 

    2.SIGSEGV(Segment fault)意味着指针所对应的地址是无效地址,没有物理内存对应该地址。 


五、弄清楚错误以后,就要查找产生错误的根源,一般我用以下两种方法: 1.gcc -g 编译       ulimit -c 20000       之后运行程序,等core dump       最后gdb -c core <exec file>  来查调用栈 2.使用strace execfile,运行程序,出错时会显示那个系统调用错

SIGBUS 和 SIGSEGV