unix编程中出现段错误如何解决

lanhaibin619 2009-03-30 10:13:30
我在unix编程中老是出现段错误,用gdb调试时,用r 命令运行,怎么每次都出现如下相同的段错误信息:
Program received signal SIGSEGV, Segmentation fault.
0xb7e0025b in strlen () from /lib/tls/i686/cmov/libc.so.6


不是说用r可以定位程序段错误的位置吗?但怎么不同的程序总是出现相同的错误信息,但程序中也并没有用strlen()函数。
请高手帮帮忙解决一下,急!
谢谢!
...全文
239 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
dongpy 2009-03-31
  • 打赏
  • 举报
回复
recvbuf[n]='\0';
=======================
当n是MAXDATASIZE时,访问越界了。

改为:
char recvbuf[MAXDATASIZE+1]; 试试
morris88 2009-03-31
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 lanhaibin619 的回复:]
好像不是这两处的错误,注了后仍然是这样的错误
[/Quote]


void savedata(char *recvbuf, int len, char *data)
{
int i;
for(i=0; recvbuf!='\0'; i++)
{
data[i]=recvbuf[i];
}
}
  • 打赏
  • 举报
回复
段错误,内存操作越界,仔细跟踪一下。
可以看下段错误总结,增加点经验
http://oss.lzu.edu.cn/blog/article.php?tid_700.html
lanhaibin619 2009-03-30
  • 打赏
  • 举报
回复
好像不是这两处的错误,注了后仍然是这样的错误
mosaic 2009-03-30
  • 打赏
  • 举报
回复
段错误一般都是数组越界,或者指针有问题。

你看一下savedata,会越界的。
假设recvbuf收到了1024了字节,那么savedata(recvbuf, count, data); 这里传入的count为1024,而data只分配了1024,在saveData函数里面,对data操作是从下标1024开始的,这种情况下,显然有很明显的越界。

另外程序中有很多strlen,为什么说没有呢?
morris88 2009-03-30
  • 打赏
  • 举报
回复
data[len++]=recvbuf[i];

为何len++?
morris88 2009-03-30
  • 打赏
  • 举报
回复
void process_cli(CLIENT *client, char recvbuf[], int len)
{
int count=0;
char data[MAXDATASIZE];
printf("new client:%s.port is:%s\n",inet_ntoa(client->addr.sin_addr),ntohs(client->addr.sin_port));
printf("Receive data is:%s\n",recvbuf);
count+=strlen(recvbuf);
recvbuf[strlen(recvbuf)]='\0';
savedata(recvbuf, count, data);
ReverseString(recvbuf,strlen(recvbuf));
send(client->fd, recvbuf, strlen(recvbuf),0);
}
void savedata(char *recvbuf, int len, char *data)
{
int i;
for(i=0; recvbuf!='\0'; i++)
{
[i] data[len++]=recvbuf[i];

}
}
lanhaibin619 2009-03-30
  • 打赏
  • 举报
回复
谢谢!其服务器代码如下:
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <unistd.h>
#include <netinet/in.h>
#include <string.h>
#include <stdlib.h>

#define PORT 7000
#define BACKLOG 5
#define MAXDATASIZE 1000
//#define FD_SETSIZE 6

typedef struct CLIENT
{
int fd;
char *name;
struct sockaddr_in addr;
char *data;
}CLIENT;

void process_cli(CLIENT *client, char recvbuf[], int len);
void savedata(char *recvbuf, int len, char *data);
void ReverseString(char recvBuf[], int numBytes);

int main(void)
{
int i, maxi, maxfd, sockfd;
int nready,n;
fd_set rset, allset;
int listenfd, connectfd;
struct sockaddr_in servaddr;
CLIENT client[FD_SETSIZE];
char recvbuf[MAXDATASIZE];
int sin_size;

if((listenfd=socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
printf("socket error!\n");
exit(-1);
}
bzero(&servaddr, sizeof(servaddr));

servaddr.sin_family=AF_INET;
servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
servaddr.sin_port=htons(PORT);

if(bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1)
{
printf("socket bind error!\n");
exit(-1);
}
listen(listenfd, BACKLOG);

sin_size = sizeof(struct sockaddr_in);

maxfd = listenfd;
maxi = -1;
for (i =0; i< FD_SETSIZE; i++)
client[i].fd = -1;
FD_ZERO(&allset);
FD_SET(listenfd, &allset);

while (1)
{
struct sockaddr_in addr;
rset = allset;
nready = select (maxfd+1, &rset, NULL, NULL, NULL);
if (FD_ISSET(listenfd, &rset))
{
if ((connectfd = accept(listenfd, (struct sockaddr *)&addr, &sin_size)) == -1)
{
perror("accept error.\n");
continue;
}
}
for (i = 0; i < FD_SETSIZE; i++)
{
if (client[i].fd < 0)
{
client[i].fd = connectfd;
client[i].name = (char*)malloc(MAXDATASIZE*sizeof(char));
client[i].addr = addr;
client[i].data = (char *)malloc(MAXDATASIZE*sizeof(char));
client[i].name[0] = '\0';
client[i].data[0] = '\0';
printf(" You got a connection from %s.\n",inet_ntoa(client[i].addr.sin_addr));
break;
}
}
if (i == FD_SETSIZE)
printf("too many cllients.\n");

FD_SET(connectfd, &rset);

if (connectfd > maxfd) maxfd = connectfd;
if (i > maxi) maxi =i;
//if ( --nready <= 0)continue;
/* if (FD_ISSET (listenfd… */
for (i = 0; i <= maxi; i++)
{
if ((sockfd = client[i].fd) < 0)continue;
if (FD_ISSET(sockfd, &rset))
{
if (( n = recv(sockfd, recvbuf, MAXDATASIZE, 0)) <= 0)
{
close(sockfd);
printf("Client (%s) closed connection. User’s data: %s\n", client[i].name, client[i].data);
FD_CLR(sockfd, &allset);
client[i].fd = -1;
free(client[i].name);
free(client[i].data);
}
else
{
recvbuf[n]='\0';
process_cli(&client[i], recvbuf, n);
}
if ( --nready <=0 ) break;
} /* if (FD_ISSET(sockfd, &rset)) */
} /* for(i = 0; i <= maxi; i++) */
} /* while(1); */
close(listenfd);
}
void process_cli(CLIENT *client, char recvbuf[], int len)
{
int count=0;
char data[MAXDATASIZE];
printf("new client:%s.port is:%s\n",inet_ntoa(client->addr.sin_addr),ntohs(client->addr.sin_port));
printf("Receive data is:%s\n",recvbuf);
count+=strlen(recvbuf);
recvbuf[strlen(recvbuf)]='\0';
savedata(recvbuf, count, data);
ReverseString(recvbuf,strlen(recvbuf));
send(client->fd, recvbuf, strlen(recvbuf),0);
}
void savedata(char *recvbuf, int len, char *data)
{
int i;
for(i=0; recvbuf[i]!='\0'; i++)
{
data[len++]=recvbuf[i];
}
}
void ReverseString(char recvBuf[], int numBytes)
{
int i;
char ch;
for(i=0; i<=(numBytes-1)/2;i++)
{
ch=recvBuf[i];
recvBuf[i]=recvBuf[numBytes-1-i];
recvBuf[numBytes-1-i]=ch;
}
recvBuf[numBytes]='\0';
}
在调用process_cli(CLIENT *client, char recvbuf[], int len)时出现段错误。
threeleafzerg007 2009-03-30
  • 打赏
  • 举报
回复
还是找一下core dump 文件 gdb bt一下比较实际
光说怎能解决问题。
morris88 2009-03-30
  • 打赏
  • 举报
回复
可能是你调用的其他函数,其实现内部隐含调用了strlen。

那个,要看看程序才能确定原因呢?

23,120

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧