SORU
1 EKİM 2010, Cuma


Hala Ulaşılabilir Sızıntısı Valgrind ile tespit

Tüm fonksiyonları bu blok belirtilen kütüphane fonksiyonları vardır. Nasıl bu bellek sızıntısı düzeltebilir miyim?

Altında listelenir "Hala ulaşılabilirgüçlü " kategorisi. (Çok benzer, ama farklı boyutlarda olan 4 tane daha var)

 630 bytes in 1 blocks are still reachable in loss record 5 of 5
    at 0x4004F1B: calloc (vg_replace_malloc.c:418)
    by 0x931CD2: _dl_new_object (dl-object.c:52)
    by 0x92DD36: _dl_map_object_from_fd (dl-load.c:972)
    by 0x92EFB6: _dl_map_object (dl-load.c:2251)
    by 0x939F1B: dl_open_worker (dl-open.c:255)
    by 0x935965: _dl_catch_error (dl-error.c:178)
    by 0x9399C5: _dl_open (dl-open.c:584)
    by 0xA64E31: do_dlopen (dl-libc.c:86)
    by 0x935965: _dl_catch_error (dl-error.c:178)
    by 0xA64FF4: __libc_dlopen_mode (dl-libc.c:47)
    by 0xAE6086: pthread_cancel_init (unwind-forcedunwind.c:53)
    by 0xAE61FC: _Unwind_ForcedUnwind (unwind-forcedunwind.c:126)

Yakalamak:Benim çalıştırdım sonra, hiçbir bellek sızıntısı verdi, ama mevcut değildi Valgrind çıktısı, ek bir satır vardı:

Atarak 0x5296fa0-0x52af438 en syms /lib/libgcc_s-4.4.4-20100630.bu yüzden.1 munmap nedeniyle()

Eğer sızıntı düzeltilmesi mümkün olsa, birisi en azından bu munmap sebebini açıklayabilir() satırı Valgrind 0 "hala" sızdırıyor? erişilebilir rapor neden olur

Düzenleme:

Burada en az test örneği:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

void *runner(void *param) {
    /* some operations ... */
    pthread_exit(NULL);
}

int n;

int main(void) {

    int i;
    pthread_t *threadIdArray;

    n=10; /* for example */

    threadIdArray = malloc((n n-1)*sizeof(pthread_t));  

    for(i=0;i<(n n-1);i  ) {
        if( pthread_create(&threadIdArray[i],NULL,runner,NULL) != 0 ) {
            printf("Couldn't create thread %d\n",i);
            exit(1);
        }
    }


    for(i=0;i<(n n-1);i  ) {
        pthread_join(threadIdArray[i],NULL);
    }

    free(threadIdArray);

    return(0);
}

İle çalıştırın:

valgrind -v --leak-check=full --show-reachable=yes ./a.out

CEVAP
4 EKİM 2010, PAZARTESİ


Tanımlamak için birden fazla yolu vardır "bellek sızıntısı". Özellikle, "" programcılar arasında. ortak kullanımda olan bellek sızıntısı iki temel tanımları vardır

İlk yaygın"", "Bellek tahsis edildi ve program sonlandırıldı önce daha sonra serbest bırakıldı." bellek sızıntısı tanımlamak için kullanılan" Ancak, birçok programcı (haklı olarak) bu tanıma uygun bir bellek sızıntısı bazı türleri aslında her türlü sorunu teşkil etmez savunuyorlar ve bu nedenle kabul edilmemelidirdoğruem "bellek sızıntısı".

"Bellek sızıntısı "tahsis edildi ... Hafıza", Bir belki daha katı (ve daha yararlı) tanımı ^em>olamazprogram artık ayrılan bellek bloğu için bir püf noktası vardır, çünkü daha sonra serbest bırakılır." Diğer bir deyişle, artık herhangi bir püf noktası var o boş bellek edemiyor. Bu bellek bu nedenle bir "bellek sızıntısı". Valgrind vadede bu daha sıkı tanımı "bellek sızıntısı" olarak kullanır. Bu potansiyel olarak önemli bir yığın tükenmesi, özellikle de uzun ömürlü işler için neden kaçak türüdür.

"Hala ulaşılabilir" Valgrind var sızıntısı rapor içinde kategori sadece ilk tanımı uygun ayırma anlamına gelir "bellek sızıntısı". Bu bloklar serbest değildi, ama program yine de bu bellek blokları işaretçileri takip çünkü serbest eğer programcı isteseydi () olabilirlerdi.

Genel olarak, "hala" engeller. ulaşılabilir dert etmenize gerek yok Sorun o tip bir poz vermezlerdoğrubellek sızıntıları neden olabilir. Örneğin, "hala" engeller. ulaşılabilir normalde yığın tükenmesi için potansiyel yok Bu bloklar genellikle başvurular sürecinin ömrü boyunca tutulur bir zaman ayırma ihtiyacı vardır. Geçmesi ve program açığa çıkar sağlamak olabilir detümayrılan bellek, genellikle işletim sistemi işlemi sonlandırır sonra işlemin bellek boşalır beri bunu yaparken pratik yararı zaten yok. Bu kontrastdoğrueğer sabitlenmemiş bırakılırsa, bir süreç neden olabilecek bir bellek sızıntısı bellek eğer sol yeterince uzun çalışan, ya da sadece gerekli olandan çok daha fazla bellek kullanmak için bir süreç neden olur.

Muhtemelen sadece zaman yararlı emin olmak için tüm ayırmaları gerekiyor eşleşen "boşaltır" eğer kaçak tespit araçları söyleyemem hangi taşı "hala ulaşılabilir" (ama Valgrind. bunu yapabiliriz) ya da işletim sistemi yok geri tüm süreci sonlandırmak bellek (tüm platformlar olan Valgrind olmuştur taşıdık bunu yapmak).

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Dion Coulls

    Dion Coulls

    16 AĞUSTOS 2006
  • ParryGripp

    ParryGripp

    12 AĞUSTOS 2006
  • pissengehen

    pissengehen

    26 EYLÜL 2006