免费注册 查看新帖 |

Chinaunix

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

请教拷贝动态库导致segmentation fault的原因 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-08-21 11:08 |只看该作者 |倒序浏览
动态库是由mmap映射到进程空间。如果在动态库加载后,使用诸如cp这样的命令来替换原来的动态库。经常会导致进程由于segmentation fault退出。
不知道其根本原因是什么呢?
个人理解,动态库通过经过mmap后,会为进城创建相应的虚拟地址空间结构以及mapping结构。当进城访问这个动态库时,它被读入内存。由于建立mapping。它应该进入page cache。也就是其inode的radix tree。如果这个时候,用cp 替换改动态库。cp在打开文件时,内核发现有系统中inode已经在缓存中,因此会继续使用这个inode(有些unix好像是重新建立inode,然后改变dentry来指向他)。这样,新动态库中的内容就会覆盖缓存中的内容。不过,这也仅仅是内存覆盖。但是为什么会造成segmentation fault呢?因为动态库所在的线性地址范围并没有变化。

谢谢。

论坛徽章:
0
2 [报告]
发表于 2009-08-21 13:40 |只看该作者
你cp覆盖的新的so是不是有问题?
你依然还是用老的so进行覆盖会有问题吗?

论坛徽章:
0
3 [报告]
发表于 2009-08-21 14:01 |只看该作者

回复 #2 emmoblin 的帖子

新的so应该不会有问题,不过也说不定。我只是想看看什么导致了这个问题。有个链接说明了这个问题:
http://blog.kangkang.org/index.php/archives/49
但是没有分析root cause。
有同样的so覆盖倒是没有试过。

论坛徽章:
0
4 [报告]
发表于 2009-08-21 17:43 |只看该作者

回复 #3 xiegang112 的帖子

做了个实验,发现其mmap的内存可访问范围会根据新的文件的大小而改变。
1)map一个8k的data文件并不断访问这个8k内存区,然后用一个4k的新文来替换data文件。程序报bus error(和segment fault 一样)。
2)而,如果是先删掉data文件,然后把新文件cp成data文件,则程序不会出错。

对于1), 当data文件被替换时,也就是文件在写入时,会检查其page cache的映射。产生bus error,说明其文件映射变短了。
2)删除data文件,但程序仍能读data文件的数据,说明文件系统里面的inode及其page cache任然没有被释放。而是等程序结束后才释放。这个应该是其mapping或者page cache的refrence count来控制的。

so被替换而导致seg fault可能就是这个原因。

论坛徽章:
0
5 [报告]
发表于 2009-08-23 10:33 |只看该作者
恩,总之再运行过程中,替换so出问题是可以理解的。

论坛徽章:
0
6 [报告]
发表于 2009-08-24 09:45 |只看该作者

回复 #5 emmoblin 的帖子

但是,如果不是用cp,而是用mv,好像不会有问题。因为mv是先删除,再创建。这样,两个文件的inode不一样。而被map的文件的inode现在只在内存中存在。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP