欢迎来到天天文库
浏览记录
ID:9214990
大小:309.26 KB
页数:20页
时间:2018-04-23
《segmentation fault in linux》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、SegmentationFaultinLinuxSegmentationFaultinLinux——原因与避免Author:ZX_WING(xing5820@163.com)1SegmentationFaultinLinux写在前面的话最近CU(chinaunix)出现了很多问segmentationfault的帖子,其实这也是个“月经贴”了,泡CU几年,每个月都有人问。为了减少重复回帖,笔者结合自己的经验,总结了SIGSEGV在Linux中产生的机理,并用实际例子概括哪些编程错误容易引发SIGSEGV。由于本人经验有限,文中难
2、免有疏漏和错误,请发现的朋友发信到xing5820@163.com指正,笔者好即使修改。(版权声明:本文欢迎转载,但未经允许不得用于商业目的)2SegmentationFaultinLinux内容提要本文简单介绍了Segmentationfault发生的原因,结合实际例子描述了内核向用户态程序发送SIGSEGV信号的流程。文中以实例回答了常见的一些SIGSEGV问题,例如“为什么函数返回了栈还可以访问?”、“为什么free()后的内存仍然可以使用”、“为什么我遇到的是SIGSEGV而不是SIGILL信号”等。最后笔者结合自己的经
3、验,列举了一些预防SIGSEGV的编程习惯,供大家参考。SIGSEGV严格依赖操作系统、编译器、硬件平台,本文基于Linux、GCC、32bitIA32架构,但对其他平台操作系统也有借鉴意义。3SegmentationFaultinLinuxRevisionHistory日期版本描述2009.12.211.0初次发表版本4SegmentationFaultinLinux1.什么是“SegmentationfaultinLinux”?我们引用wiki上的一段话来回答这个问题。Asegmentationfault(oftenshor
4、tenedtoSIGSEGV)isaparticularerrorconditionthatcanoccurduringtheoperationofcomputersoftware.Asegmentationfaultoccurswhenaprogramattemptstoaccessamemorylocationthatitisnotallowedtoaccess,orattemptstoaccessamemorylocationinawaythatisnotallowed(forexample,attemptingtowri
5、tetoaread-onlylocation,ortooverwritepartoftheoperatingsystem).Segmentationisoneapproachtomemorymanagementandprotectionintheoperatingsystem.Ithasbeensupersededbypagingformostpurposes,butmuchoftheterminologyofsegmentationisstillused,"segmentationfault"beinganexample.So
6、meoperatingsystemsstillhavesegmentationatsomelogicallevelalthoughpagingisusedasthemainmemorymanagementpolicy.OnUnix-likeoperatingsystems,aprocessthataccessesaninvalidmemoryaddressreceivestheSIGSEGVsignal.OnMicrosoftWindows,aprocessthataccessesinvalidmemoryreceivesthe
7、STATUS_ACCESS_VIOLATIONexception.上述文字没有给出SIGSEGV的定义,仅仅说它是“计算机软件操作过程中的一种错误情况”。文字描述了SIGSEGV在何时发生,即“当程序试图访问不被允许访问的内存区域(比如,尝试写一块属于操作系统的内存),或以错误的类型访问内存区域(比如,尝试写一块只读内存)。这个描述是准确的。为了加深理解,我们再更加详细的概括一下SIGSEGV。�SIGSEGV是在访问内存时发生的错误,它属于内存管理的范畴�SIGSEGV是一个用户态的概念,是操作系统在用户态程序错误访问内存时所
8、做出的处理。�当用户态程序访问(访问表示读、写或执行)不允许访问的内存时,产生SIGSEGV。�当用户态程序以错误的方式访问允许访问的内存时,产生SIGSEGV。从用户态程序开发的角度,我们并不需要理解操作系统复杂的内存管理机制,这是和硬件平台相关的。但是,了解
此文档下载收益归作者所有