免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 62114 | 回复: 61
打印 上一主题 下一主题

月经结贴 -- 《Segmentation Fault in Linux》 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-12-21 17:23 |只看该作者 |倒序浏览
写在前面的话
    最近CU(chinaunix)出现了很多问segmentation fault的帖子,其实这也是个“月经贴”了,泡CU几年,每个月都有人问。为了减少重复回帖,笔者结合自己的经验,总结了SIGSEGV在Linux中产生的机理,并用实际例子概括哪些编程错误容易引发SIGSEGV。由于本人经验有限,文中难免有疏漏和错误,请发现的朋友发信到xing5820@163.com指正,笔者好即使修改。

内容提要
  本文简单介绍了Segmentation fault发生的原因,结合实际例子描述了内核向用户态程序发送SIGSEGV信号的流程。文中以实例回答了常见的一些SIGSEGV问题,例如“为什么函数返回了栈还可以访问?”、“为什么free()后的内存仍然可以使用”、“为什么我遇到的是SIGSEGV而不是SIGILL信号”等。最后笔者结合自己的经验,列举了一些预防SIGSEGV的编程习惯,供大家参考。SIGSEGV严格依赖操作系统、编译器、硬件平台,本文基于Linux、GCC、32bit IA32架构,但对其他平台操作系统也有借鉴意义。


大家在阅读的过程中发现什么错误,或我没有讲到的segfault情况,请及时指出,我好更正。

Segmentation fault in Linux.pdf

309.26 KB, 下载次数: 4416

论坛徽章:
0
2 [报告]
发表于 2009-12-21 17:28 |只看该作者
下来看看。。。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
3 [报告]
发表于 2009-12-21 17:28 |只看该作者

回复 #1 zx_wing 的帖子

沙发居然被 …… 抢了……
留名

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
4 [报告]
发表于 2009-12-21 17:39 |只看该作者

回复 #1 zx_wing 的帖子

看了一下……  看来那帖子我是白费口水了……
表面上说接受, 实际上依然是在鼓励大家编写不可移植代码 —— 而且, 并不是为了得到什么实际的好处。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2009-12-21 17:58 |只看该作者
当你的一个需求,标准的方法不能满足时,只有两种可能:
1.从一开始的设计就错了,才会导致错误的需求;
2.你读过的代码太少,不知道业界解决该问题的标准方法是什么。

论坛徽章:
0
6 [报告]
发表于 2009-12-21 18:04 |只看该作者
原帖由 OwnWaterloo 于 2009-12-21 17:39 发表
看了一下……  看来那帖子我是白费口水了……
表面上说接受, 实际上依然是在鼓励大家编写不可移植代码 —— 而且, 并不是为了得到什么实际的好处。

哈哈哈,我是接受你看问题的角度,其它的我持保留意见。
至于这篇文章嘛,已经不在标准范畴了,我一开始也说,这是非常平台相关的

论坛徽章:
0
7 [报告]
发表于 2009-12-21 18:13 |只看该作者
楼主应该写书啊, 做独立技术写作也不错…

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
8 [报告]
发表于 2009-12-21 18:18 |只看该作者

回复 #6 zx_wing 的帖子

char a[] = "hello";
char* p;

for ( p = a+sizeof(a)-2; p>=a; p-- )
      printf("%c\n", *p );

与:

for ( p = a+sizeof(a)-2; p!=a; p-- )
      printf("%c\n", *p );


效果是一样的: 如果真出现那帖里的情况, 不会越界,不会引发signal, 而是死循环。



上面2个版本与下面一个版本相比:

for ( p = a+sizeof(a)-1; p!=a /* or p>=a */; ) {
      --p;
      printf("%c\n", *p );
}

得到的好处就是 : 少写一行代码。  就为了这么点好处值得将代码变得不可移植么
如果推荐下面一种写法, 什么烦恼都没有了, 比如不需要补充这么一句:
笔者无法100%保证,所以大家在实践中还是各自斟酌吧。



当然,会出现回绕的机器只是假象出来的, 也许下面一种写法的好处永远得不到。
我只是反感这么一种风气: 将自己的实践、 不经过严格的论证, 就上升到理论高度, 认为那是普遍真理
我真的不是在说你,  你的文章里至少还有那么一句补充说明, 以说明这种经验的适用范围
我其实说的是林锐…… 以及和林锐有相同倾向的一帮人……


算了, 别人写的代码是否可移植关我鸟事 ……   大家爱怎么写就怎么写好了……

[ 本帖最后由 OwnWaterloo 于 2009-12-21 18:20 编辑 ]

论坛徽章:
0
9 [报告]
发表于 2009-12-21 18:35 |只看该作者
原帖由 albcamus 于 2009-12-21 18:13 发表
楼主应该写书啊, 做独立技术写作也不错…

哈哈哈,哪儿有那功夫,平时忙的要死,泡个论坛都是忙里偷闲了。
上次不是chen xu过来提到说我泡CU,我差不多都要忘了有好久没上过了。
写书真是吃力不讨好的事情,就那本在内核版打广告的书,我虽然只写了一章加一节,但被老板当较字工人让去review全书,那真是一个字一个字得看,一个字一个字的改啊,惨的不行。发现错误还要去请教那些大牛原意是什么的,然后帮他们重写。还是写点这种小文好了,全凭兴趣,想怎么写就怎么写
中国人搞技术啊,真是为了讨生活,除非像老外衣食无忧纯粹的"working for fun"差不多。

论坛徽章:
0
10 [报告]
发表于 2009-12-21 18:45 |只看该作者
先顶贴再看文章是lenky的一贯作风。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP