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,运行程序,出错时会显示那个系统调用错
时间: 2024-11-05 13:38:36

SIGBUS 和 SIGSEGV的相关文章

关于SIGSEGV错误及处理方法

http://blog.csdn.net/brace/article/details/1102422 今天编程遇到了SIGSEGV错误,比较困惑,所以找了些资料,总结一下: (1)官方说法是: SIGSEGV --- Segment Fault. The possible cases of your encountering this error are: 1.buffer overflow --- usually caused by a pointer reference out of ran

Android信号处理

首先澄清,本文讨论的信号是 Linux 软中断信号,而不是手机状态条里面用于显示当前手机通信强度的那个信号. 我们知道,Unix系统里信号是一种软中断.尽管本身存在缺陷(后面会讨论到),但是作为Unix系统重要的异步事件处理方式之一,在Unix系统中发挥重要的作用.可以说,所有Unix系统(包括Linux)都不可能忽略信号的支持. Android 本质上也是个在 Linux 系统,自然也少不了对 信号处理的支持. 但我们也知道,Android和其他Linux系统一个很大的差异就是增加了虚拟机的支

红帽Linux故障定位技术详解与实例(1)

红帽Linux故障定位技术详解与实例(1) 2011-09-28 14:26 圈儿 BEAREYES.COM 我要评论(0) 字号:T | T 在线故障定位就是在故障发生时, 故障所处的操作系统环境仍然可以访问,故障处理人员可通过console, ssh等方式登录到操作系统上,在shell上执行各种操作命令或测试程序的方式对故障环境进行观察,分析,测试,以定位出故障发生的原因. AD:2014WOT全球软件技术峰会北京站 课程视频发布 红帽Linux故障定位技术详解与实例是本文要介绍的内容,主要

结构体指针之 段错误 具体解释(segmentation fault)

一个网友问了我一个问题.一个C程序执行出现了段错误,这个问题非常好.非常多刚開始学习的人都easy犯这个错误,详细代码例如以下: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" > 这个编译没有问题,可是执行是段错误    Segmentation fault 由于你定义了一个结构体指针p.用来指向此类

QT程序出现Bus Error问题的调试

原文 1.文档目的 本文档目的在于探究部分QT程序在嵌入式板子上出现BusError问题的调试及解决方法: 以数码相框程序出现的BusError为例: 2.原因分析 2.1产生BusError的可能原因: BusError即总线错误,BusError通常都是因为非对齐访问造成的.CPU在设计上为了性能上的考虑,要求待访问,操作的数据地址都要对齐.如果发现没有对齐的访问,就会向当前进程发出SIGBUS信号,使程序崩溃.RISC包括MIPS都是这种类型的芯片.而X86架构就没有这种对齐要求.所以代码

【APUE】Chapter14 Advanced I/O

14.1 Introduction 这一章介绍的内容主要有nonblocking I/O, record locking, I/O multiplexing, asynchronous I/O, the readv and writev, memory-mapped I/O 这一章是后面章节的基础,也就是说先当成基础记着,在后面的实操应用章节再去体会. 14.2 Nonblocking I/O "blocking"主要针对slow system call,含义是“the slow sy

php几个不起眼儿的小技巧

说是不起眼儿的小技巧,其实应该说是不常用的常规应用吧.很多事情就是这样,知道是一马事儿,会用是一马事儿,精习又是另外一马事儿.而成为高手更是需要扎实的基本功. str_repeat 重复输出字符串就靠它了,类似于perl里面的x php -r 'echo str_repeat("ABC",5),"\n";' ABCABCABCABCABC substr 这个是用来截取字符器的,比如要截取字符串的第一个字母: $string = 'abcdefg' substr($s

IOS调试技巧:当程序崩溃的时候怎么办 iphone IOS

转载:http://article.ityran.com/archives/1143 有这样一种情形:当我们正在快乐的致力于我们的app时,并且什么看都是无比顺利,但是突然,坑爹啊,它崩溃了.(悲伤地音乐响起) 我们需要做的第一件事就是:不要惊慌. 修复崩溃不是很困难的.假如你崩溃了,并且胡乱的改些东西,而且还在不停的念着咒语希望bug神奇的自动消失,你大多数情况下都会使情况更麻烦.相反的,你需要知道一些系统的方法,并且学习怎么找到崩溃和他的原因. 第一件需要知道的就是在你的代码中准确的找到cr

关于Segmentation fault错误

今天写程序时候出现了Segmentation fault,在网上查了一些资料,基本上的原因是,非法的内存访问. 例如数组的越界,在循环操作时循环变量的控制问题,也有字符串拷贝时长度溢出,指针指向了非法的空间,还有就是申明一个指针,但却没有对其初始化,就直接引用,或者没有开辟内存空间就释放内存,下面是自己找的一些可能情况,当做提醒自己吧. 1.内存访问越界 a) 由于使用错误的下标,导致数组访问越界. b) 搜索字符串时,依靠字符串结束符来判断字符串是否结束,但是字符串没有正常的使用结束符. c)