免费注册 查看新帖 |

Chinaunix

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

[C++] 求助一个程序崩溃的错误 [复制链接]

论坛徽章:
3
丑牛
日期:2013-11-13 10:22:35子鼠
日期:2013-11-18 18:10:04未羊
日期:2013-12-18 15:12:05
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-12-10 14:44 |只看该作者 |倒序浏览
    在把一个程序从windows移植到linux下遇到的问题。
   程序是一个中间件的作用,在windows下运行正常,移植到linux下就出现了问题。大致就是客户端服务端通过该中间件交互信息,该程序使用socket通信吧。然后启动后调用服务能调用成功,但是调用几次之后程序就宕掉了。
   查看了core文件,里面是
Program terminated with signal 11, Segmentation fault.
#0  0x00002b05482a70dd in vfprintf () from /lib64/libc.so.6
    用bt命令后
#0  0x00002b05482a70dd in vfprintf () from /lib64/libc.so.6
#1  0x00002b05482c5af9 in vsprintf () from /lib64/libc.so.6
。。。(省略号处是一堆重复的有关一些动态库的库文件的内容,有几千条)
最后几行显示的是select函数附近的代码。

在程序中,select附近代码大致如下:
while(循环条件)
{
     ... //初始化套接字

    ...//设置超时时长

    ...//设定套接字

    Ret = select(64, &Readfds, &Writefds, &Exceptfds, &Time);
      if (Ret < 1 )
      {
          Sleep(1);
          continue;
      }

      ...//对是否有数据来的一些判断的代码
}

查看core文件的时候发现bt命令后有时候显示在select,有时候在Sleep。
然后select返回值是0,应该是超时的意思吧。

就我个人感觉,gdb查看core文件之后产生的消息意思是fprintf函数造成了段错误造成程序崩溃的样子。不过代码里有用到这函数的地方都看了下,好像没啥问题。
然后之后还有指向select函数的。select函数超时的话会对程序造成影响吗?还有在通信中会有哪些原因造成select函数超时呢?

这个代码移植时就是改了些头文件啊还有些调用的函数,主要的实现部分是没改动的,在windows下完全没问题,linux下调用几次就崩溃了。

现在就纠结是什么原因造成了程序崩溃了,求大神帮我分析下可能是啥原因造成的错误。
   

论坛徽章:
2
天秤座
日期:2014-01-15 13:50:58天秤座
日期:2014-02-19 17:09:23
2 [报告]
发表于 2013-12-10 15:19 |只看该作者
新手菜鸟,不懂,帮顶!

论坛徽章:
0
3 [报告]
发表于 2013-12-10 15:26 |只看该作者
看不到源程序,也不能帮你分析

论坛徽章:
0
4 [报告]
发表于 2013-12-10 17:57 |只看该作者
本帖最后由 wmytch 于 2013-12-10 17:58 编辑

搞错了,编辑掉

论坛徽章:
0
5 [报告]
发表于 2013-12-14 12:17 |只看该作者
段错误,大多是因为指针==NULL。

论坛徽章:
1
15-16赛季CBA联赛之青岛
日期:2015-12-25 16:45:28
6 [报告]
发表于 2013-12-20 11:38 |只看该作者
linux下面有个文件描述符,这个数量默认程序是有限制的,看看超时后,这个描述符被关闭没

论坛徽章:
3
丑牛
日期:2013-11-13 10:22:35子鼠
日期:2013-11-18 18:10:04未羊
日期:2013-12-18 15:12:05
7 [报告]
发表于 2013-12-20 14:06 |只看该作者
回复 6# cfan0330


    select那部分代码大概如下

while( WaitForSingleObject == WAIT_TIMEOUT ){  //这里的WaitForSingleObject函数已经在linux下做了对应的实现
      
       ... //初始化套接字

     ...//设置超时时长

     ...//设定套接字

     iRet = select(64, &Readfds, &Writefds, &Exceptfds, &Seltime);

       if (iRet < 1)
     
     {

        Sleep(1);

             continue;

       }

       ...//对数据的判断与处理函数
}

这样应该select返回0或者-1就直接sleep1毫秒就进入下一次循环吧。初始化套接字算是关闭描述符么

论坛徽章:
3
丑牛
日期:2013-11-13 10:22:35子鼠
日期:2013-11-18 18:10:04未羊
日期:2013-12-18 15:12:05
8 [报告]
发表于 2013-12-20 14:11 |只看该作者
回复 6# cfan0330


    而且有时候bt之后显示的代码在accept函数那 大致就是在这俩函数处报错的样子
   在linux下用gdb去跟的话attach上那进程后一发消息就提示收到个信号,然后直接就segment fault 好纠结,然后只好去看core文件,然后就像这样了。。。

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-09-23 06:20:00
9 [报告]
发表于 2013-12-21 22:49 |只看该作者
肯定不是select/accept的问题,大多是fprintf等格式化字符串的函数用的有问题。

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-09-23 06:20:00
10 [报告]
发表于 2013-12-21 22:51 |只看该作者
你用gdb load core dump,确保symbol加载的正确,然后post上来完整bt的结果
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP