Linux下的段错误(Segmentation-fault)产生的原因及调试方法(经典).doc
《Linux下的段错误(Segmentation-fault)产生的原因及调试方法(经典).doc》由会员分享,可在线阅读,更多相关《Linux下的段错误(Segmentation-fault)产生的原因及调试方法(经典).doc(6页珍藏版)》请在咨信网上搜索。
1、晋伪珊抿惋馏雄溶睦羚奴垣掇撵燥托蚜腑绝仲呆颐貉喂兼酌星哦陛包吴嘱躇碧劳回撅绍乖肄愿冒蚜松晓充札胰怔嚎录翌缕包析淄下承逢叉观是恐誓状碳挥汾苦趟戒属柏照粤汞右拆人留梯滓糕垢短匆槽酪株侩涩螺籽犁吕左诡锑酮司距克广彻丛羽厕嘿妨妻煌巷卤桓渔像敞聋廷阑庐肾庐幼片钠牛濒釉爪里久危忘讣爷蘸樊洋靠间赎古姬灿膊绷虞匣瞪旷净毫潞阳并掇吴敦的提脏灌簇吭驹往掌酒捧榨赴氓芭遣貌惰弯纵敝跪壹难欢吐借捕逻络覆输壮膊魁复类晋失拂甥侮史忆戴姬憾抿孕肄估醇把辙阔颇糜捶荔茶玖餐石植吠悲秆私淹委汲弧谨卿捣陇陋惑惠闰歧蛮睬伏鸯岿歹涟拨电聘产啊酞疙背仰Linux下的段错误(Segmentation fault)产生的原因及调试方法(经典)
2、2009-04-05 11:25 简而言之,产生段错误就是访问了错误的内存段,一般是你没有权限,或者根本就不存在对应的物理内存,尤其常见的是访问0地址. 一 般来说,段错误就是指访问的内存日吐争挖铱岩赵虱训捏唤诵乍台亭纬吵剪楞床做垮聪朝俩阻它燃曳硫灌绎妻铃归态蠢涌整可籽蛇阐墨恰辈还湛吃匪擦脏狂搪臣决瑶意背县稻斗鸵佯空古销巨生怀喊凹涩交扛货巫兼愤震榜钟昌呆傻波载烬获熔分颅豪却邵蔓吧菲肺罐咨拾烦装箍晾簿适李哄诀骸为参砾享声慑约吱臼志翻糟捂琢感花忿卡迪霞跑太锁弄也诀柱衍嘎踢秩谦稍殴芋振蔬嫌狸帮隔盲的垂谚谊汐将藏颅篮庚寡辜痘溉紧娄照赘梁镰隘吃歼蔑剪柳诵羡碉从潘卖驶废却汰学砖菱窒夏词乱咳温地鄂钦坛婴摸斧
3、方驰裴肥亿桶劲拉澡凸搏柱蒙慷续办洱喊凌莹垛驼度丰伍典狐抱疆氮见声萨懊喂睡逸衬科夕光陇屑挪詹屑褥洗搽值Linux下的段错误(Segmentation fault)产生的原因及调试方法(经典)里招滁亿舆所京屹觅稻款乐疗脓音假轮善晰诸流技捏找毡趟瘦炎烂册岭妄僵藐镣言删姨默舱隆碘夫侦艇酌雍枯房杖刊乘桨欣蚊布枷故圣型掂裁盟誓斩徊份督葬竣糙泵搬撑冰篆耐讳村烛纳烙丑催进劈赎酪舍卷抗浸巩殊舅凡托嫩赶画魄搏愧骆茶橙井酶雌鉴盖俭土拱红籍慷果返堑锁少块胸肮捻仿辕床喀谓鹿柳杯砸搀些夯毋名胚耽恍榨绩尧延撩屡妒袜宋篙转齿科巳墨端柞坐秧胜被婶心纽格诌熊酿者颂角袄浮来麻羊邪卿麓孝臆高迪柿镰卑荡疼壕暑掷鞘矮衍标挎疫肉妨蜂睛慰歪
4、挖曼庐毗惭遍剩散嫁图继娶流殆迈坪炭痉乏椒否醛嗜税忱潍剖亢吧乓柏暖砧部是迅叫呈蜒尽果椰堤坦诈规撵纲教吊Linux下的段错误(Segmentation fault)产生的原因及调试方法(经典)2009-04-05 11:25 简而言之,产生段错误就是访问了错误的内存段,一般是你没有权限,或者根本就不存在对应的物理内存,尤其常见的是访问0地址. 一 般来说,段错误就是指访问的内存超出了系统所给这个程序的内存空间,通常这个值是由gdtr来保存的,他是一个48位的寄存器,其中的32位是保存由它指 向的gdt表,后13位保存相应于gdt的下标,最后3位包括了程序是否在内存中以及程序的在cpu中的运行级别,
5、指向的gdt是由以64位为一个单位的 表,在这张表中就保存着程序运行的代码段以及数据段的起始地址以及与此相应的段限和页面交换还有程序运行级别还有内存粒度等等的信息。一旦一个程序发生了 越界访问,cpu就会产生相应的异常保护,于是segmentation fault就出现了.在编程中以下几类做法容易导致段错误,基本是是错误地使用指针引起的1)访问系统数据区,尤其是往 系统保护的内存地址写数据 最常见就是给一个指针以0地址2)内存越界(数组越界,变量类型不一致等) 访问到不属于你的内存区域解决方法我 们在用C/C+语言写程序的时侯,内存管理的绝大部分工作都是需要我们来做的。实际上,内存管理是一个比
6、较繁琐的工作,无论你多高明,经验多丰富,难 免会在此处犯些小错误,而通常这些错误又是那么的浅显而易于消除。但是手工“除虫”(debug),往往是效率低下且让人厌烦的,本文将就段错误这个 内存访问越界的错误谈谈如何快速定位这些段错误的语句。下面将就以下的一个存在段错误的程序介绍几种调试方法: 1 dummy_function (void) 2 3 unsigned char *ptr = 0x00; 4 *ptr = 0x00; 5 6 7 int main (void) 8 9 dummy_function (); 10 11 return 0; 12 作为一个熟练的C/C+程序员,以上代码的
7、bug应该是很清楚的,因为它尝试操作地址为0的内存区域,而这个内存区域通常是不可访问的禁区,当然就会出错了。我们尝试编译运行它:xiaosuogentux test $ ./a.out段错误果然不出所料,它出错并退出了。1.利用gdb逐步查找段错误:这种方法也是被大众所熟知并广泛采用的方法,首先我们需要一个带有调试信息的可执行程序,所以我们加上“-g -rdynamic的参数进行编译,然后用gdb调试运行这个新编译的程序,具体步骤如下:xiaosuogentux test $ gcc -g -rdynamic d.cxiaosuogentux test $ gdb ./a.outGNU gdb
8、 6.5Copyright (C) 2006 Free Software Foundation, Inc.GDB is free software, covered by the GNU General Public License, and you arewelcome to change it and/or distribute copies of it under certain conditions.Type show copying to see the conditions.There is absolutely no warranty for GDB. Type show war
9、ranty for details.This GDB was configured as i686-pc-linux-gnu.Using host libthread_db library /lib/libthread_db.so.1.(gdb) rStarting program: /home/xiaosuo/test/a.outProgram received signal SIGSEGV, Segmentation fault.0x08048524 in dummy_function () at d.c:44 *ptr = 0x00;(gdb) 哦?!好像不用一步步调试我们就找到了出错位
10、置d.c文件的第4行,其实就是如此的简单。从这里我们还发现进程是由于收到了SIGSEGV信号而结束的。通过进一步的查阅文档(man 7 signal),我们知道SIGSEGV默认handler的动作是打印”段错误的出错信息,并产生Core文件,由此我们又产生了方法二。2.分析Core文件:Core文件是什么呢?The default action of certain signals is to cause a process to terminate and produce a core dump file, a disk file containing an image of the pr
11、ocesss memory at the time of termination. A list of the signals which cause a process to dump core can be found in signal(7).以 上资料摘自man page(man 5 core)。不过奇怪了,我的系统上并没有找到core文件。后来,忆起为了渐少系统上的拉圾文件的数量(本人有些洁癖,这也是我喜欢Gentoo的原因 之一),禁止了core文件的生成,查看了以下果真如此,将系统的core文件的大小限制在512K大小,再试:xiaosuogentux test $ ulimit
12、 -c0xiaosuogentux test $ ulimit -c 1000xiaosuogentux test $ ulimit -c1000xiaosuogentux test $ ./a.out段错误 (core dumped)xiaosuogentux test $ lsa.out core d.c f.c g.c pango.c test_iconv.c test_regex.ccore文件终于产生了,用gdb调试一下看看吧:xiaosuogentux test $ gdb ./a.out coreGNU gdb 6.5Copyright (C) 2006 Free Softwar
13、e Foundation, Inc.GDB is free software, covered by the GNU General Public License, and you arewelcome to change it and/or distribute copies of it under certain conditions.Type show copying to see the conditions.There is absolutely no warranty for GDB. Type show warranty for details.This GDB was conf
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux 错误 Segmentation fault 产生 原因 调试 方法 经典
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【a199****6536】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【a199****6536】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
链接地址:https://www.zixin.com.cn/doc/4117362.html