2016-07-07 21 views
-2

Ich sah, es gibt viele Fragen im Zusammenhang mit diesem, aber ich habe nicht gefunden, eine, die mir ähnlich ist. Ich betreibe ein Modell in gemischten C und Fortran auf einer LSF-Plattform. Die Sache mit dem Kabel ist, dass mein Modell gut lief, bis letzte Woche dieser Fehler losgeworden ist. Was sogar verkabelt ist, ist, dass der Fehler nicht jedes Mal auftritt: Manchmal kann das Modell laufen (kein Fehler), manchmal bricht der Job ab, wenn er versucht, die Eingabedateien einzulesen. Der Fehler zeigt auf den Code, wo ich nie geändert habe Bisher habe ich versucht:sehr seltsame Fehler *** glibc entdeckt ** free() ungültiger Zeiger

1) neu kompilieren Sie den Quellcode und verwenden Sie die neu erstellte ausführbare Datei;

2) Kopieren Sie die ausführbare Datei von einem anderen Verzeichnis, das gut läuft;

3) löschen Sie das gesamte Verzeichnis und erstellen Sie ein neues Verzeichnis und wiederholen Sie die obigen beiden;

4) startet von einem frischen Login

5) laufen nur 1 Job jedes Mal die Möglichkeit auszuschließen, dass der Einfluss von anderen Jobs auf demselben Knoten läuft

6) ändern Sie die Jobnamen

7) ändern Sie die Lauflänge (Modelljahr)

Und der Fehler tritt immer noch 90% der Zeiten. Der Fehler zeigt auf die Datei inpakC.c (ich habe einen Teil der Datei hinzugefügt) 'free (line)' Teil. Ich sehe nichts falsch daran, da es sich um einen vorgeschriebenen Code handelt. Jede Hilfe oder Beratung wird sehr geschätzt werden!

enter image description here

enter image description here

#ifdef MPI 
int ipck_LoadF(char *filename, MPI_Comm comm) 
#else 
int ipck_LoadF(char *filename) 
#endif 
{ 
    /*local variables */ 
    FILE *fileptr;    /*pointer to the file */ 
    int bsize;     /*buffer size (this was the default used in   

    int maxLsize;     /*max line size(this was the default used in 
    char *line;     /*the next line in the file */ 
    int n, m, clrt; 
    int my_address; 
    int c; 

    my_address =0; 
    #ifdef MPI 
    MPI_Comm_rank(comm, &my_address); 
    #endif 
if(my_address == 0){ 
    bsize = 0; 
    maxLsize = 0; 
    clrt = 1; /*current line running total set to zero*/ 

    /*open the file */ 
    /*if the file was not opened, exit and return 1 */ 
    if ((fileptr = fopen(filename, "r")) == NULL) 
    { 
return 1; 
    } 
    /*go through file and count the number of elements - used to know how much mem to allocate*/ 
    while ((c = fgetc(fileptr)) != EOF) 
    { 
    bsize++; 
    clrt++; 
    /*get length of longest line*/ 
    if (c == '\n')/*end of the line has been reached*/ 
     { 
     if (clrt > maxLsize)/*line contains the most char so far*/ 
     { 
     maxLsize = clrt; 
     clrt = 1; 
     } 
     else /*line has less char than the record so just reset the counter*/ 
     { 
     clrt = 1; 
     } 
     } 
     } 
    /*allocate mem for the buffer*/ 
    buffer = (char *) calloc(bsize, sizeof(char)); 
    /*postion pointer back to the begining*/ 
    rewind(fileptr); 

    /*read the contents of the file into the buffer variable */ 
    while (!feof(fileptr)) 
    { 
     /*allocate memory to hold the line to read into and the trimmed line */ 
     line = (char *) calloc(maxLsize, sizeof(char)); 

     /*get the next line */ 
     fgets(line, maxLsize, fileptr); 

     /*see if the next line is blank; if so skip the rest 
     and continue retrieving lines*/ 
     if(strcmp(line, "\n")==0) continue; 

     /*get the position of the comment character. 
     if one does not exist, it will return the length of the string*/               
     n=strcspn(line,"#"); 

     m=n-2; 
     while (*(line+m)==' ' || *(line+m)=='/' || *(line+m)=='\n'){ 
     n--; 
     m--; 
     } 

if (n > 0){ 
    /*cat n-1 chars to the buffer  */ 
    strncat(buffer,line,n-1); 
} 


/*put a padded space after the new line added to the buffer */ 
strcat(buffer, " "); 
/*clean up strings and flush */ 
free(line); 
fflush(fileptr); 
} 
/*close the file */ 
fclose(fileptr); 
    } 
     /*broadcast to all of the nodes*/ 
     #ifdef MPI 
     MPI_Bcast(&bsize,1,MPI_INT,0,comm); 
     if (my_address != 0) 
     buffer = (char *) calloc(bsize, sizeof(char)); 
      MPI_Bcast(buffer,bsize,MPI_CHAR,0,comm); 
     #endif 
     return 0; 
    } 
+0

Verwenden Sie [Valgrind] (http://valgrind.org). Wenn Sie einen ungültigen Speicherzugriff ausführen, wird Ihnen angezeigt, wo. – dbush

+0

Sie möchten zunächst Ihren Einzug und falsche Kommentare korrigieren. – EOF

+0

Und posten Sie keine Bilder von Text! – Olaf

Antwort

0

Der Fehler bedeutet, dass etwas() auf einen Zeiger auf freien zu nennen versucht, die nicht gültig ist frei auf nennen. Entweder kam es nicht von malloc(), oder es wurde bereits freigegeben. Dies deutet normalerweise auf eine Speicherbeschädigung hin. Etwas in Ihrem Programm überschreibt Speicher, was nicht sein sollte. Wahrscheinlich, weil es in ein Array mit einem ungültigen Index schreibt. Es ist überhaupt nicht ungewöhnlich, dass sich diese Art von Problem auf unvorhersehbare Weise reproduziert, wie Sie es beschrieben haben.

Diese Art von Problem kann schwierig zu finden sein. Einige Ansätze sind:

  • put die Überprüfung der Grenzen Behauptungen neben Ihrem Array greift

  • Lauf unter einem Tool wie valgrind oder address sanatizer, die diese Art von Problem zu erkennen versucht.

  • untersuchen Sie den Inhalt des Speichers unter einem Debugger und versuchen Sie herauszufinden, was schief gelaufen ist.