• 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。执行程序,出错时会显示那个系统调用错

  • 相关阅读:
    MacOS Sierra允许运行任何来源的程序
    Windows Server2008 R2中的角色
    Linux根目录解析
    Linux安装配置SVN服务器
    Linux6.x修改出eth0网卡的解决方法
    如何利用mount命令挂载另一台服务器上的目录
    Arcgis水文分析-Dem提取集水区
    前端布局之Flex布局
    其实我就是想好好的写写代码(一个伪程序猿的独白)
    WebApi关于配置全局返回Json数据格式时间以及命名小写
  • 原文地址:https://www.cnblogs.com/wzjhoutai/p/6747625.html
Copyright © 2020-2023  润新知