[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: