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!
#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;
}
Verwenden Sie [Valgrind] (http://valgrind.org). Wenn Sie einen ungültigen Speicherzugriff ausführen, wird Ihnen angezeigt, wo. – dbush
Sie möchten zunächst Ihren Einzug und falsche Kommentare korrigieren. – EOF
Und posten Sie keine Bilder von Text! – Olaf