Bei dem Programm dupmerge, von
https://sourceforge.net/projects/dupmerge/files/, habe ich unter Ubuntu
18.10 das Problem, das strndup() nicht mehr genügend Speicher bekommt
und Null-Pointer zurückgibt.
Das tritt auf an der Stelle, an der die Dateinamen in Datenfelder
eingelesen werden:
1
if ((NULL == (names[i] = strndup (buf, BUFSIZ))) or (NULL == (a_names[i] = strndup (buf, BUFSIZ))))
2
{
3
(void) fprintf (stderr, "%s: Out of memory, ((NULL == (names[i] = strndup (buf, BUFSIZ))) or (NULL == (a_names[i] = strndup (buf, BUFSIZ))))\n", argv[0]);
Dort zeigt sich, mit einem zusätzlichen printf():
dupmerge: Out of memory, ((NULL == (names[i] = strndup (buf, BUFSIZ)))
or (NULL == (a_names[i] = strndup (buf, BUFSIZ))))
i=29909, j=35, names[i]=(nil), a_names[i]=(nil)
Also bei circa 1 MB ist plötzlich Schluß, auch für root, obwohl das
letztes Jahr noch funktionierte.
free zeigt mir aber reichlich freien Speicher:
Gesamt belegt frei gemns. Puffer/Cache
verf�gbar
Speicher: 65709980 6917308 10054464 1091276 48738208
57026856
Auslagerungsspeicher: 2097148 0 2097148
Wieso bekommt strndup keinen Speicher mehr und wie bekomme ich das Limit
wieder weg?
Früher, bei 32Bit, gab es das Problem, mmap() blendete so viel Speicher
in den Adressbereich ein, dass brk() einen Fehler lieferte, obwohl noch
genug vorhanden war.
Es zeigte sich, das der Fehler von einer ganz anderen Stelle kommt, eine
Inline-Funktion zum Initialisieren.
Wird das inline entfernt, ist der Fehler weg.
Der GCC reagiert in letzter Zeit allergisch auf Inline-Funktionen, meist
mit dem Symptom das der Linker sie nicht findet, bei ganz anderen
Programmen.
Erwin M. schrieb:> Der GCC reagiert in letzter Zeit allergisch auf Inline-Funktionen, meist> mit dem Symptom das der Linker sie nicht findet, bei ganz anderen> Programmen.
Kann er auch nicht, weil Inline-Funktionen vom Compiler i.W. durch
kopieren behandelt werden.
Uhu U. schrieb:> Erwin M. schrieb:>> Der GCC reagiert in letzter Zeit allergisch auf Inline-Funktionen, meist>> mit dem Symptom das der Linker sie nicht findet, bei ganz anderen>> Programmen.>> Kann er auch nicht, weil Inline-Funktionen vom Compiler i.W. durch> kopieren behandelt werden.
Also nach Kopieren, was ja durch die Inline-Deklaration korrekt ist, ist
die Funktion assimiliert und nicht mehr zu linken. Damit sollte der
Linker keine Spur mehr davon sehen. Also irgendwo ist da ein Fehler und
den bekomme ich nur durch Entfernen der inline-Deklaration weg, wobei
die über 10 Jahre lang problemlos waren.
Die inline-Deklaration lasse ich deshalb lieber weg.