免费注册 查看新帖 |

Chinaunix

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

一段C程序老是出現 Segmentation fault? [复制链接]

求职 : 数据库管理员
论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-08-05 11:25 |只看该作者 |倒序浏览
請各位幫忙分析一下,問題在哪?
謝謝

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "socket/socketutl.h"


#define BSIZE 1024
struct sockfile
{
&nbsp;&nbsp;&nbsp;&nbsp;char buf[BSIZE +1];
&nbsp;&nbsp;&nbsp;&nbsp;char *tok , *bot;
&nbsp;&nbsp;&nbsp;&nbsp;char *lim;
&nbsp;&nbsp;&nbsp;&nbsp;int sock ;
&nbsp;&nbsp;&nbsp;&nbsp;int state ; //socket state


};


int sk_open(struct sockfile *sf, int sock)
{
&nbsp;&nbsp;&nbsp;&nbsp;sf->tok = sf->buf;
&nbsp;&nbsp;&nbsp;&nbsp;sf->lim = sf->buf ;
&nbsp;&nbsp;&nbsp;&nbsp;sf->bot = sf->buf;
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;sf->sock = sock ;
&nbsp;&nbsp;&nbsp;&nbsp;sf->state = 0;  


&nbsp;&nbsp;&nbsp;&nbsp;return 0;
}

int sk_fill(struct sockfile *sf)
{
&nbsp;&nbsp;&nbsp;&nbsp;if  (sf->state <0) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return  -1 ;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;int cnt = sf->lim - sf->tok;
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;if(cnt>0){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(sf->buf, sf->tok, cnt);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sf->tok = sf->buf ;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sf->bot = sf->buf ;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sf->lim = sf->buf + cnt ;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;int rcnt  = BSIZE - cnt ;

&nbsp;&nbsp;&nbsp;&nbsp;if((cnt = recv(sf->sock, sf->lim, rcnt, 0)) >0){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sf->lim[cnt] = '\0';
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sf->lim += cnt ;
&nbsp;&nbsp;&nbsp;&nbsp;} else {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sf->state=-1 ;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return -1 ;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;return  0;

}


int sk_readline(struct sockfile *sf, char **line, int *len)
{

&nbsp;&nbsp;&nbsp;&nbsp;char *ptr ;
start:

&nbsp;&nbsp;&nbsp;&nbsp;sf->bot = sf->tok ;
&nbsp;&nbsp;&nbsp;&nbsp;ptr = sf->bot ;
&nbsp;&nbsp;&nbsp;&nbsp;while (ptr < sf->lim) {

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (*ptr== '\n') {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (ptr[-1] =='\r') {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ptr[-1] = '\0' ;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*ptr='\0';
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*len = ptr - sf->bot -1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sf->tok = ++ptr ;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*line =sf->bot ;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ptr ++;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;if (sf->state <0){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return -1;
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;sk_fill(sf) ;
&nbsp;&nbsp;&nbsp;&nbsp;goto start ;
}



int main()
{

&nbsp;&nbsp;&nbsp;&nbsp;int sock;
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;char *host = "172.17.2.43";

&nbsp;&nbsp;&nbsp;&nbsp;if ((sock= tcp_connect(host, 80)) < 0) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("connect  error\n") ;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return -1 ;
&nbsp;&nbsp;&nbsp;&nbsp;}


&nbsp;&nbsp;&nbsp;&nbsp;char header[1024] ;

&nbsp;&nbsp;&nbsp;&nbsp;sprintf(header,"%s%s%s%s",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"Pragma:no-cache\r\n",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"Accept-Encoding:GZIP\r\n",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"Connection:close\r\n",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT5)\r\n");
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;tcp_send(sock, "GET %s HTTP/1.0\r\n%s   \r\n\r\n", "/auto_update/y3_cost/md5sum.txt", header);

&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;char *line =NULL;
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;struct sockfile sk ;
&nbsp;&nbsp;&nbsp;&nbsp;sk_open(&sk, sock);
&nbsp;&nbsp;&nbsp;&nbsp;int cnt ;
&nbsp;&nbsp;&nbsp;&nbsp;int len=0;
&nbsp;&nbsp;&nbsp;&nbsp;while (1) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cnt =sk_readline(&sk, &line, &len);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (cnt <0) break ;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("size:%3d [%s]\n\n", len, line);
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;close(sock);
&nbsp;&nbsp;&nbsp;&nbsp;exit(1);

}

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
2 [报告]
发表于 2008-08-05 11:29 |只看该作者
那就是可以编译成可执行文件了吧。
这样建议lZ用GDB调试一下,
编译时加上-g选项,
gcc -g file.c -o file
然后程序到哪一行Fault了,GDB就结束了,这样就可以找出来了

论坛徽章:
0
3 [报告]
发表于 2008-08-05 11:56 |只看该作者
或者设置下
ulimit -c unlimited

然后运行程序...
core的时候出现core文件
gdb test core调试下....

求职 : 数据库管理员
论坛徽章:
0
4 [报告]
发表于 2008-08-05 13:52 |只看该作者
謝謝大家,用gdb調試了一下,
是這行 " sf->lim[cnt] = '\0';' 訪問出錯,
改成這樣就好了.


  1.     if(cnt>0){
  2.         memcpy(sf->buf, sf->tok, cnt);
  3.         sf->tok = sf->buf ;
  4.         sf->bot = sf->buf ;
  5.         sf->lim = sf->buf + cnt ;
  6.     }
  7. 改成這樣
  8.     if(cnt>0){
  9.                 memcpy(sf->buf, sf->tok, cnt);
  10.         }
  11.         sf->tok = sf->buf ;
  12.         sf->bot = sf->buf ;
  13.         sf->lim = sf->buf + cnt ;


复制代码

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
5 [报告]
发表于 2008-08-05 14:15 |只看该作者
呵呵,好,自己解决了问题

论坛徽章:
0
6 [报告]
发表于 2008-08-05 14:25 |只看该作者
看到段错误 马上查当时使用的内存 一般都会找到的

求职 : 数据库管理员
论坛徽章:
0
7 [报告]
发表于 2008-08-05 15:05 |只看该作者

謝謝大家了

Linux下的socket 用fdopen 打開, 在用gnu getline有多方便.
也不用繞這個大彎子了, 函數還有些問題,我再調整調整.

论坛徽章:
0
8 [报告]
发表于 2008-08-12 18:55 |只看该作者
指针问题!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP