当前位置: 技术问答>linux和unix
求助,SIGSEGV 错误怎么修改?
来源: 互联网 发布时间:2016-12-11
本文导语: 我用dbg运行一个程序的时候出现错误,内容为 Program received signal SIGSEGV, Segmentation fault. 0x08048e20 in split (),以上给出的是split()函数,有谁帮我看一下,再帮我纠正这个错误,谢谢了! /*宏,将cline串中从pos所...
我用dbg运行一个程序的时候出现错误,内容为 Program received signal SIGSEGV, Segmentation fault.
0x08048e20 in split (),以上给出的是split()函数,有谁帮我看一下,再帮我纠正这个错误,谢谢了!
/*宏,将cline串中从pos所表示的位置开始,跳过连续的空格和制表*/
#define del_blank(pos,cline);{
while(cline[pos]!=''&&(cline[pos]==' '||cline[pos]=='t')){
pos++;
}
}
/*宏,得到一个命令参数,将cline串中从pos所表示的位置的内容复制到arg缓冲区中,直到遇到空格、制表符或者结束符为止*/
#define get_arg(arg,pos,cline);{
int i=0;
while(cline[pos]!=''&&cline[pos]==' '&&cline[pos]=='t'){
arg[i++]=cline[pos++];
}
}
/*将一个命令分割成命令参数并存储在command_struct中,成功则返回拆分后命令参数的个数,失败返回-1*/
/*command:存储命令名和命令参数的结构体 cline命令字符串*/
int split(struct command_struct *command,char cline[]){
printf("进入split函数!!");
int i;
int pos=0;
cline[strlen(cline)-1]=''; /*得到命令字符串的长度,将最后一个‘n’替换成‘’*/
printf("strlen(cline) is:%d",strlen(cline));
del_blank(pos,cline); /*过滤空格符直到遇到第一个参数*/
i=0;
while(cline[pos]!=''){ /*处理命令字符串*/
/*为存储命令参数的数组分配空间*/
if((command->argv[i]=(char*)malloc(MAX_LENGTH))==NULL){
perror("fail to malloc1");
return -1;
}
/*得到一个参数,将两个空格之间的内容复制到存储参数的数组*/
get_arg(command->argv[i],pos,cline);
i++; /*下一个参数*/
del_blank(pos,cline); /*过虑掉空格*/
}
command->argv[i]=NULL; /*命令参数数组以NULL结尾*/
command->name=command->argv[0]; /*命令名和第一个命令参数实际上指向同一块内存区域*/
return i;
}
0x08048e20 in split (),以上给出的是split()函数,有谁帮我看一下,再帮我纠正这个错误,谢谢了!
/*宏,将cline串中从pos所表示的位置开始,跳过连续的空格和制表*/
#define del_blank(pos,cline);{
while(cline[pos]!=''&&(cline[pos]==' '||cline[pos]=='t')){
pos++;
}
}
/*宏,得到一个命令参数,将cline串中从pos所表示的位置的内容复制到arg缓冲区中,直到遇到空格、制表符或者结束符为止*/
#define get_arg(arg,pos,cline);{
int i=0;
while(cline[pos]!=''&&cline[pos]==' '&&cline[pos]=='t'){
arg[i++]=cline[pos++];
}
}
/*将一个命令分割成命令参数并存储在command_struct中,成功则返回拆分后命令参数的个数,失败返回-1*/
/*command:存储命令名和命令参数的结构体 cline命令字符串*/
int split(struct command_struct *command,char cline[]){
printf("进入split函数!!");
int i;
int pos=0;
cline[strlen(cline)-1]=''; /*得到命令字符串的长度,将最后一个‘n’替换成‘’*/
printf("strlen(cline) is:%d",strlen(cline));
del_blank(pos,cline); /*过滤空格符直到遇到第一个参数*/
i=0;
while(cline[pos]!=''){ /*处理命令字符串*/
/*为存储命令参数的数组分配空间*/
if((command->argv[i]=(char*)malloc(MAX_LENGTH))==NULL){
perror("fail to malloc1");
return -1;
}
/*得到一个参数,将两个空格之间的内容复制到存储参数的数组*/
get_arg(command->argv[i],pos,cline);
i++; /*下一个参数*/
del_blank(pos,cline); /*过虑掉空格*/
}
command->argv[i]=NULL; /*命令参数数组以NULL结尾*/
command->name=command->argv[0]; /*命令名和第一个命令参数实际上指向同一块内存区域*/
return i;
}
|
cline[strlen(cline)-1]=''; /*得到命令字符串的长度,将最后一个‘n’替换成‘’*/
字符串是以 结尾的, strlen() - 1 刚好就是 , 而不是你所谓的 n
字符串是以 结尾的, strlen() - 1 刚好就是 , 而不是你所谓的 n
|
举个例子:
split(struct command_struct *command,char cline[])
如果你command 传入函数时就为NULL,command->argv[0]=NULL 就会出错。
如果你的command不为NULL,但是你的argv[]最大为5 ,而你搞了个command->argv[6]=NULL也会出错。
|
list 查看源代码
break 打断点
具体的自己查资料吧,基本上是肉眼可以看出来的错误
程序要自己调,饭才能自己吃 :)
|
SIGSEGV, Segmentation fault
无效内存使用,出现段错误。
也就是说你程序中对某段无效的地址
空间进行了使用。一般情况是:数组
越界了;或者指针变量,没有指向某
对申请过的地址。
------------------------------
更多技术文章敬请关注:武汉华嵌-嵌入式培训专家,国内领先的嵌入式服务机构,
http://www.embedhq.org
无效内存使用,出现段错误。
也就是说你程序中对某段无效的地址
空间进行了使用。一般情况是:数组
越界了;或者指针变量,没有指向某
对申请过的地址。
------------------------------
更多技术文章敬请关注:武汉华嵌-嵌入式培训专家,国内领先的嵌入式服务机构,
http://www.embedhq.org
|
如果问题必现,你可以在split里面单步跟踪啊
backtrace 可以查看调用栈的情况,简写bt
backtrace 可以查看调用栈的情况,简写bt
|
段错误,
你访问了不改访问的内存,或者修改了不该修改的内存。
你访问了不改访问的内存,或者修改了不该修改的内存。
|
在函数被调用那里设置一个断点,然后step进入函数里面。