Shared Memory und ein Leak
Hallo C-Spezialisten!
Ich habe ein Problem mit einem daemon, der threads verwendet und darin
shmget() ... verwendet, um auf einen shared memory Bereich zuzugreifen.
Der daemon frisst mit der Zeit den Speicher auf.
Ich habe das Problem isoliert und folgendes kleines Programm zur
Veranschaulichung gemacht:
// gcc -ggdb3 -I ./ -D DEBUG -o testshm testshm.c
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <locale.h>
#include <errno.h>
#include <time.h>
#include <mcheck.h> // mtrace(), find memory leaks
int main()
{
char* sbase = NULL;
int magic = 74;
key_t key = 0;
size_t blocksize = 4096;
size_t roundedsize = 0;
size_t pagesize = 0;
int shmid = 0;
size_t overhead = 0;
const char* filename = "/tmp/testSHMdata.mem";
const char* shmname = "CoreData";
struct shmid_ds shmbuf;
setlocale(LC_ALL, "de_DE.UTF-8");
tzset();
mtrace();
pagesize = (size_t) getpagesize();
roundedsize = (((blocksize + overhead) / pagesize) +1) * pagesize;
key = ftok( filename, magic );
shmid = shmget(key, roundedsize, 0666 |IPC_CREAT|IPC_EXCL );
if( -1 == shmid )
{
if(errno == EEXIST)
{
shmid = shmget(key, roundedsize, 0666 );
}
}
sbase = shmat(shmid, NULL, 0);
shmctl(shmid, IPC_STAT, &shmbuf);
// ...
shmdt(sbase);
muntrace();
}
Auf der Commandline:
gcc -ggdb3 -I ./ -D DEBUG -o testshm testshm.c
MALLOC_TRACE=./shdtrace.txt
export MALLOC_TRACE
sudo mtrace ./testshm $MALLOC_TRACE
Das Ergebnis:
Memory not freed:
-----------------
Address Size Caller
0x00005651e189e050 0x14 at 0x7f984f3bb286
0x00005651e189e110 0x15 at 0x7f984f3bb286
0x00005651e189e4d0 0x14 at 0x7f984f3bb2c9
0x00005651e189e590 0x15 at 0x7f984f3bb286
0x00005651e18b7580 0xf at 0x7f984f385afa
0x00005651e18bebe0 0x400 at 0x7f984f36626c
0x00005651e18bfb40 0x5eb at 0x7f984f3bc96a
Welche Information habe ich übersehen? Was muss ich ausser shmdt() noch tun?
Vielen Dank für einen Tipp!
Manfred
--
Manfred Rebentisch
Reply to: