2012-03-01 21 views
6

Moim celem jest wykrycie z podstawowego pliku pośmiertnego, dlaczego określony proces pochłania dużo pamięci. Czy istnieje podsumowanie, które mogę jakoś zdobyć? Jak oczywiste valgrind jest wykluczone, ponieważ nie mogę uzyskać dostęp do procesu na żywo.Wyszukiwanie wycieku pamięci (i analiza) za pomocą gdb

Przede wszystkim coraz coś podobnego do wyjścia/proc/„PID”/Mapy, by pomóc, ale

maintenance info sections 

(jak opisano tutaj: GDB: Listing all mapped memory regions for a crashed process) w gdb nie pokazuj mi sterty zużycie pamięci .

info proc map 

to opcja, ponieważ mogę uzyskać dostęp do maszyny z tym samym kodem, ale z tego co widziałem, jest ona nieprawidłowa. Mój proces korzystał z 700 MB, ale widoczne mapy stanowiły tylko 10 MB. I nie widziałem tam .so-ów, które są widoczne w

maintenance print statistics 
Czy znasz jakieś inne polecenie, które może być przydatne?

Zawsze mogę zaprogramować kod, ale to nie jest łatwe. Wraz z osiągnięciem wszystkich przydzielonych danych za pomocą wskaźników jest jak igła w stogu siana.

Czy masz jakieś pomysły?

Odpowiedz

2

Debata powypadkowa tego rodzaju w gdb jest sztuką bardziej niż nauką.

Najważniejszym narzędziem do tego, moim zdaniem, jest możliwość pisania skryptów uruchamianych wewnątrz gdb. Instrukcja wytłumaczy ci to. Powodem, dla którego uważam to za tak użyteczne, jest to, że pozwala ci robić rzeczy takie jak chodzenie struktur danych i drukowanie informacji o nich.

Inna możliwość dla ciebie tutaj jest instrumentacja twojej wersji malloc - napisz nową funkcję malloc, która zapisuje statystyki na temat tego, co jest przydzielane, abyś mógł spojrzeć na te post mortem. Można oczywiście wywołać oryginalny malloc, aby wykonać rzeczywistą pracę przydzielania pamięci.

Przykro mi, że nie mogę dać ci oczywistej i prostej odpowiedzi, która po prostu da natychmiastową odpowiedź dla ciebie tutaj - bez narzędzi takich jak valgrind jest to bardzo trudna praca.

+0

Powinienem wtedy zajrzeć do skryptów. Zwiedzanie struktur danych to duża pomoc. – tothphu

0

Możliwe jest użycie prostego narzędzia, takiego jak log-malloc.c, które jest kompilowane w bibliotekę współużytkowaną, która jest LD_PRELOAD wydana przed aplikacją i rejestruje wszystkie funkcje typu-malloc w pliku. Przynajmniej może pomóc zawęzić wyszukiwanie w twoim zrzucie.

+0

Czy znasz jakieś 64-bitowe logo malloc? – tothphu

2

Jeśli masz Linuksa, nie musisz się martwić, że robisz statystyki do malloc. Korzystać z narzędzia o nazwie 'memusage'

dla programu próbki (sample_mem.c) jak poniżej

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

int main(voiid) 
{ 
     int i=1000; 
     char *buff=NULL; 
     srand(time(NULL)); 

     while(i--) 
     { 
       buff = malloc(rand() % 64); 
       free(buff); 
     } 

     return 0; 
} 

wyjście memusage będzie

$memusage sample_mem 

Memory usage summary: heap total: 31434, heap peak: 63, stack peak: 80 
     total calls total memory failed calls 
malloc|  1000   31434    0 
realloc|   0    0    0 (nomove:0, dec:0, free:0) 
calloc|   0    0    0 
    free|  1000   31434 
Histogram for block sizes: 
    0-15   253 25% ================================================== 
    16-31   253 25% ================================================== 
    32-47   247 24% ================================================ 
    48-63   247 24% ================================================ 

ale jeśli pisze wapper malloc następnie możesz zrobić program coredump po tej liczbie malloc, aby uzyskać wskazówkę.

+0

Dobry pomysł. Zajęło mi trochę czasu, aby dowiedzieć się, ale memusage jest częścią wydania glibc. Jednak jest to trochę podobne do uruchomienia mojego kodu w valgrind, ale przy znacznie mniejszym obciążeniu. – tothphu

Powiązane problemy