PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : kurioses problem mit malloc



tscherfel
29-06-2006, 13:30
Hallo,
vorneweg: Um das Problem zu lösen, habe ich schon einiges versucht. Ich bin für jede Idee dankbar.

Ich habe ein unter Suse 8.2 laufendes System (in C geschrieben) jetzt unter Suse 9.3 laufen (natürlich auch unter Suse 9.3 kompiliert).
Leider hat ein selbstgeschriebenes Programm von uns Probleme mit malloc Speicher anzufordern.
Das Programm möchte ca 2MB Speicher anfordern und bekommt einen NULL-Pointer zurück.
In einer Analyseroutine, die ich in das Programm eingebaut habe, konnte ich feststellen, daß das Programm an dieser Stelle ca. 47kB Speicher anfordern kann.
Mit einem anderen Programm, welches ich testweise auf dem System habe laufen lassen, konnte ich ohne Probleme ca. 1,9 GB anfordern.

Hat irdgendjemand eine Idee, wie ich diesem Problem auf die Schliche kommen kann?

Danke für jede Hilfe,
Tschüß,
Thorsten.

quinte17
29-06-2006, 13:33
kannst du das problem codeschnippsel-technisch zusammenfassen?
also, tritt es auch noch auf wenn du die meisten zeilen aus deinem programm entfernst?

wurden die 2 programme auf die gleiche art und weise compiliert?

greetz

nul
29-06-2006, 13:40
Hast du mal ueberprueft welcher Fehler nach malloc auftritt -> errno?

mcspam
29-06-2006, 21:13
schau dir mal den gnu debugger an..


gcc -g prog.c -o bla
gdb bla
> run
*error*
> bt

tscherfel
03-07-2006, 09:22
Erst mal vielen Dank für die Antworten.
Der malloc gibt errno=11 zurück (EAGAIN). Daraus kann ich nicht viel schließen. Es geht auch später nicht, das Programm probiert es ca. alle 10 Sekunden.
Das Programm umzubauen ist nicht so einfach, da es im Verbund mit anderen Programmen und Ressourcen arbeitet.
Mti dem gdb habe ich noch nichts probiert. Ist leider auch nicht so einfach, weil die Quellen auf einem anderen Rechner liegen. Und so fit bin ich mit dem gdb lleider auch nicht. Will ich aber noch mal versuchen.
Was ich jetzt gemacht habe ist:
- Mit den limits rumgespielt
/etc/security/limits.conf angepasst und im Programm mit getrlimit und setrlimit die Limits angeschaut und verändert. Hat keine veränderung im Verhalten gebracht.
- Mit valgrind einen Memory-Debugger Lauf gemacht.
Leider konnte ich aus der Logdatei keine Probleme erkennen. Ich habe aber auch nicht viel verstanden. Kennt sich jemand mit den valgrind-Logausgaben aus?
Was ich jetzt noch machen will, im Programm an verschiedenen Stellen Speicher alliziieren um möglicherweise das Problem einzugrenzen.
Tschüß,
Thorsten.

tscherfel
03-07-2006, 14:07
Innerhalb des Programms wurde am Anfang ein mlockall(MCL_FUTURE) gemacht.
Das hatte zur Folge, daß der malloc nicht funktionierte. Jetzt habe ich den mlockall-Aufruf rausgenommen, und schon gehts. :)
Da hat sich wohl an der Stelle zwischen Suse 8.2 und 9.3 was geändert.

Vielen Dank nochmal an alle,
Tschüß
Thorsten.

Joghurt
07-07-2006, 00:18
Lesen bildet ;)
If MCL_FUTURE has been specified, then a later system call (e.g.,
mmap(2), sbrk(2), malloc(3)), may fail if it would cause the number of
locked bytes to exceed the permitted maximum (see below).[...]
Since Linux 2.6.9, no limits are placed on the amount of memory that a
privileged process can lock and the RLIMIT_MEMLOCK soft resource limit
instead defines a limit on how much memory an unprivileged process may
lock.