Segmentation fault (core dumped)错误 急!!
本帖最后由 haaini 于 2013-07-01 14:55:36 编辑 Linux下执行的一个C程序,在一部分数据上执行成功,但是偶尔有些数据会出现Segmentation fault (core dumped)错误,数据的格式是一致的,请各位大牛帮忙看看是为什么呀????
只需要看到128行就行了,后面是重复的操作~
1 #include <stdio.h>
2 #include <string.h>
3 //#include <windows.h>
4
5
6 /************************** get substring *********************************/
7 char* substr(char* str,unsigned start, unsigned end)
8 {
9 if(start>end || end>=strlen(str)){
10 printf("parameter of get substr error!\t");
11 return NULL;
12
13 }
14 unsigned n = end - start+1;
15 static char stbuf[2000];
16 strncpy(stbuf, str + start, n);
17 stbuf[n] = 0;
18
19 // memset(stbuf,0,sizeof(char)*16384);
20 return stbuf;
21 }
22
23
24 //************************get pos of char in string**************************
25 int findChar(char* str,char c){
26 if(str == NULL)return -1;
27 int len = strlen(str);
28
29 for(int i=0;i<len;i++){
30 if(str[i] == c){
31 return i;
32 }
33 }
34 return -1;
35
36 }
37
38
39
40
41 int main(int argc,char *argv[]){
42 //***********
43 FILE *fp;
44 FILE *wfp;
45
46 argc = 6;
47 argv[1] = "/home/work/logbak/I09_165/deleteSpider/mcp.log.2013062800";
48 //argv[1] = "/home/work/xumengling/testin2";
49 argv[2] = "/home/work/xumengling/testout";
50 argv[3] = "url";
51 argv[4] = "pageid=Wplq1v1s";
52 argv[5] = "ubid=aolg_rcmm_news_0";
53 //argv[5] = "bkid=201304224144172";
54 //argv[6] = "ubid=aolg_rcmm_news_0";
55 //argv[7] = "dkfrc=1";
56
57
58 fp = fopen(argv[1],"r");
59 printf("source file: %s\t",argv[1]);
60 if (fp == NULL){
61 printf("fopen fp ng\n");
62 return 0;
63 }
64
65 printf("destfile: %s\n",argv[2]);
66 wfp = fopen(argv[2],"at");
67 //wfp = fopen("D:\\VSPrroject\\getBasic\\Debug\\testout.txt","at");
68 if (wfp == NULL){
69 printf("fopen wfp ng\n");
70 return 0;
71
72 }
73
74 char buf[26384];
75 char tmp[26384];
76 char* p=NULL;
77 char* cont;
78 char* content;
79 char uid[300];
80
81
82
83
84 //************get according $tag1, $tag2*********************
85 if (argv[3] != NULL && argv[4] != NULL && argv[5] != NULL && argc == 6){ //get according $tag1, $tag2
86
87 while(fgets(buf,26384,fp) != NULL){ //read line
88 memset(tmp,0,sizeof(char)*26384);
89 strcpy(tmp,buf);
90 // char uid[800];
91
92
93 if(strstr(tmp,argv[3]) != NULL){ //has content
94 cont = strstr(tmp,argv[3]);
95 int end = findChar(cont,' ');
96 end--;
97 content = substr(cont,0,end);
98 //printf("%s\t",content);
99
100
101 if(strstr(content,argv[4]) != NULL && strstr(content,argv[5]) != NULL){ //has $tag1, $tag2
102 p = strtok(tmp," ");
103
104 while(p != NULL){ //every token
105 //printf("%s\t",p);
106 if(strstr(p,"uid[") == p){
107 strcpy(uid,p);
108 //printf("%s\t",uid);
109 }
110 p = strtok(NULL," ");
111 }//end every token
112 if(uid != NULL){
113 fputs(uid,wfp);
114 fputs("\n",wfp);}
115 memset(uid,0,sizeof(char)*300);
116 // memset(p,0,sizeof(char)*16384);
117
118 }//end has $tag1, $tag2
119
120
121 }
122
123 memset(buf,0,sizeof(char)*26384);
124 } //end read line
125
126
127
128 }// end if
129 //************************************************************
130
131
132 //************get according $tag1, $tag2,$tag3*********************
133 if (argv[3] != NULL && argv[4] != NULL && argv[5] != NULL && argv[6] != NULL && argc == 7){ //get according $tag1, $tag2
134
135 while(fgets(buf,26384,fp) != NULL){ //read line
136 memset(tmp,0,sizeof(char)*26384);
137 strcpy(tmp,buf);
138 // char uid[200];
139
140
141 if(strstr(tmp,argv[3]) != NULL){ //has content
142 cont = strstr(tmp,argv[3]);
143 int end = findChar(cont,' ');
144 end--;
145 content = substr(cont,0,end);
146
147 if(strstr(content,argv[4]) != NULL && strstr(content,argv[5]) != NULL && strstr(content,argv[6]) != NULL){ //has $tag1, $tag2,$tag3
148 p = strtok(tmp," ");
149
150 while(p != NULL){ //every token
151 if(strstr(p,"uid[") == p){
152 strcpy(uid,p);
153 }
154
155
156
157 p = strtok(NULL," ");
158 }//end every token
159 if(uid != NULL){
160 fputs(uid,wfp);
161 fputs("\n",wfp);
162 }
163 memset(uid,0,sizeof(char)*300);
164
165 }//end has $tag1, $tag2,$tag3
166
167
168 }
169
170 memset(buf,0,sizeof(char)*26384);
171 } //end read line
172
173
174
175 }// end if
176 //*****************************************************************
177
178 //************get according $tag1, $tag2,$tag3,$tag4*********************
179 if (argv[3] != NULL && argv[4] != NULL && argv[5] != NULL && argv[6] != NULL && argv[7] != NULL && argc == 8){ //get according $tag1, $tag2,$tag3,$tag4
180
181 while(fgets(buf,26384,fp) != NULL){ //read line
182 memset(tmp,0,sizeof(char)*26384);
183 strcpy(tmp,buf);
184 // char uid[200];
185
186
187 if(strstr(tmp,argv[3]) != NULL){ //has content
188 cont = strstr(tmp,argv[3]);
189 int end = findChar(cont,' ');
190 end--;
191 content = substr(cont,0,end);
192
193 if(strstr(content,argv[4]) != NULL && strstr(content,argv[5]) != NULL && strstr(content,argv[6]) != NULL && strstr(content,argv[7]) != NULL){ //has $tag1, $tag2
194 p = strtok(tmp," ");
195
196 while(p != NULL){ //every token
197 if(strstr(p,"uid[") == p){
198 strcpy(uid,p);
199 }
200
201
202
203 p = strtok(NULL," ");
204 }//end every token
205 if(uid != NULL){
206 fputs(uid,wfp);
207 fputs("\n",wfp);
208 }
209 memset(uid,0,sizeof(char)*300);
210
211 }//end has $tag1, $tag2,$tag3,$tag4
212
213
214 }
215
216 memset(buf,0,sizeof(char)*26384);
217 } //end read line
218
219
220
221 }// end if
222 //*****************************************************************
223
224
225
226
227 // ************/
228
229
230
231
232
233
234 /************test***********
235
236 char* t = "asdfghjkl";
237 int len = strlen(t);
238 char c = 'v';
239 int i = findChar(t,c);
240 //char* a = substr(t,-1,2);
241 if(i>=0){
242 printf("pos:%d",i);}
243 //printf(" sub:%s",a);
244
245
246
247 ***************************/
248
249 fclose(wfp);
250 fclose(fp);
251
252 return 1;
253
254 } C
[解决办法]
进程意外退出会在当前目录下产生‘code’文件或形如‘core.数字’的文件比如‘core.1234’
使用命令
gdb 运行程序名 core或core.数字
进入gdb然后使用bt命令
可以查看进程意外退出前函数调用的堆栈,内容为从上到下列出对应从里层到外层的函数调用历史。
如果进程意外退出不产生core文件,参考“ulimit -c core文件最大块大小”命令