首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

Segmentation fault (core dumped)异常 急

2013-07-09 
Segmentation fault (core dumped)错误 急!!本帖最后由 haaini 于 2013-07-01 14:55:36 编辑Linux下执行的

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文件最大块大小”命令

热点排行