免费注册 查看新帖 |

Chinaunix

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

[C] 兄弟请进:奇怪的Segmentation fault...(已解决) [复制链接]

论坛徽章:
1
程序设计版块每日发帖之星
日期:2016-06-04 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-03-08 19:59 |只看该作者 |倒序浏览
本帖最后由 robin10 于 2013-03-08 21:08 编辑

背景:
之前几乎没接触过网络编程方面的东西,
近来在写一个简单的server/client 玩。

测试过程中遇到一个自己搞不懂的Seg fault.
希望有知情者可以解析解析。
也希望后来者可以借鉴一下。
先谢过了。

1.纯C的一个C/S 小程序。
流程很简单,
server 一直监听某个端口;
client 打开socket, 通过socket 向 server 发送一些字符串;
server收到后再发回相应的字符串;
server close socket;


2.server 调用了几个libx1.so ,libx2.so ...
   libx?.so 是自己写的。

   client 没有调用标准库之外的lib.

3. server/client/libx?.so 都存放在某个个人目录下。(因为目前只是测试使用)
比如 ~/test/ 下
当我make install 的时候,会用 cp -f  PATH/xx  ~/test/ 这样的方式,重新把所有的库和可执行文件拷贝到test目录下。

4.运行的时候:
cd ~/test
export LD_LIBRARY_PATH =./
./server  


./client

************************************************************************************

a.测试过程中,不时出现了seg fault. 尝试重现,很难。
b. 无意中发现,当server 还在跑的时候,我make install (没有修改任何代码),也就是把lib ,server ,client重新拷贝到test目录下。
c.我再跑client (server在make install之前已经跑了起来)。这样,我就100%得到了 segmentation fault.


据之前的了解,
程序在跑之前,系统应该已经把程序(sever) 以及共享库(libx?.so)  load到了 MEM里了(?)
为什么我重新拷贝这些文件到test目录下以后(代码没有修改,所以这些拷贝的文件也和之前的是一样的),
就出现了seg fault了呢??


请知情者解析一下,谢谢!




评分

参与人数 1可用积分 +4 收起 理由
lenky0401 + 4 比较好的问题案例

查看全部评分

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
2 [报告]
发表于 2013-03-08 20:08 |只看该作者
问问题的都不贴代码,拿分走人

论坛徽章:
1
程序设计版块每日发帖之星
日期:2016-06-04 06:20:00
3 [报告]
发表于 2013-03-08 20:15 |只看该作者
本帖最后由 robin10 于 2013-03-08 20:37 编辑

回复 2# cokeboL
如果理解没错。。那么。
好像和代码关系不大吧?
还是谢谢。

   

论坛徽章:
1
程序设计版块每日发帖之星
日期:2016-06-04 06:20:00
4 [报告]
发表于 2013-03-08 20:17 |只看该作者
本帖最后由 robin10 于 2013-03-09 01:01 编辑

OS:
uname -a
Linux robin-desktop 2.6.32-38-generic #83-Ubuntu SMP Wed Jan 4 11:12:07 UTC 2012 x86_64 GNU/Linux

gcc -v
Using built-in specs.
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.4.3-4ubuntu5.1' --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.4 --program-suffix=-4.4 --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-plugin --enable-objc-gc --disable-werror --with-arch-32=i486 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5.1)

----strace Log------------------------------------------------------------


futex(0x1653010, FUTEX_WAKE_PRIVATE, 1) = 1
write(1, "waiting accept!....\n", 20waiting accept!....
)   = 20
futex(0x7f0a35092df0, FUTEX_WAKE_PRIVATE, 1) = 1
##thpool_thread_do##177#
accept(3, ##thpool_thread_do##179#
# Thread working: 847656704 -> #client_request_handle#sockfd = 4#
.......
#get_cb_func#index = 1#
#### run_func :7.
#refresh_page_down#size=3
##send_message##
#refresh_page_down#send=353
##client_request_handle## close socket 4
##thpool_thread_do##170#       // 此处是跑完上次的地方,从下一行开始,是make install 后跑 client的LOG
{sa_family=AF_INET, sin_port=htons(50249), sin_addr=inet_addr("127.0.0.1")}, [16]) = 5
write(1, "client accept!....\n", 19client accept!....
)    = 19
write(1, "server: got connection from 127."..., 39server: got connection from 127.0.0.1#
) = 39
write(1, "#thpool_add_task#sockfd = 5#\n", 29#thpool_add_task#sockfd = 5#
) = 29
--- SIGSEGV (Segmentation fault) @ 0 (0) ---
+++ killed by SIGSEGV +++
Segmentation fault

论坛徽章:
1
程序设计版块每日发帖之星
日期:2016-06-04 06:20:00
5 [报告]
发表于 2013-03-08 20:24 |只看该作者
PS.如果没有make install
跑了server以后
多次跑client ,或者跑多个client
都没有问题。
在这种情况下,client/server尝试了2KW次的链接和收发数据,也没有出现问题。。

论坛徽章:
1
程序设计版块每日发帖之星
日期:2016-06-04 06:20:00
6 [报告]
发表于 2013-03-08 20:57 |只看该作者
做了几个实验:
1. mv server server1
./server1
make install
./client

client send data.
Segmentation fault.

2. while make install ,
just cp the libs to ~/test

the same result.

3. while make install ,
just cp server and client to ~/test.

NO seg fault.


结论是,主要是覆盖了共享库导致的。

论坛徽章:
1
程序设计版块每日发帖之星
日期:2016-06-04 06:20:00
7 [报告]
发表于 2013-03-08 21:07 |只看该作者

原来是不可以使用cp 这样的方式来替换正在使用的共享库的。。
下面链接供参考:
http://blog.sina.com.cn/s/blog_622a99700100pjv3.html

http://www.piao2010.com/linux%E5 ... C%E5%8D%87%E7%BA%A7

http://www.ibm.com/developerworks/cn/linux/l-dynlink/index.html

谢谢~

论坛徽章:
0
8 [报告]
发表于 2013-03-08 23:36 |只看该作者
新人,学习下

论坛徽章:
1
程序设计版块每日发帖之星
日期:2016-06-04 06:20:00
9 [报告]
发表于 2013-03-09 00:43 |只看该作者
注册时间2006-03-09
最后登录2013-03-08


.....Shit....
不信邪都不行。。。
近来瞎忙,比较少上CU,没想到今天刚好是ID注册满7周年。。。

论坛徽章:
1
程序设计版块每日发帖之星
日期:2016-06-04 06:20:00
10 [报告]
发表于 2013-03-09 02:19 |只看该作者
找到了一个更加详细的说明,
有兴趣的朋友可以看看
http://hi.baidu.com/ops_bd/item/7312d80a776d929803ce1bed
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP