2009-05-12 11 views
14

gdzie do malloc() i free() przechowują przydzielone adresy i ich rozmiary (Linux GCC)? Czytałem, że niektóre implementacje przechowują je gdzieś przed faktyczną przydzieloną pamięcią, ale nie mogłem tego potwierdzić w moich testach.Gdzie zrobić malloc()/free() Przechowywać przydzielone rozmiary i adresy?

Tło, może ktoś ma inną wskazówkę na ten temat: Trochę eksperymentuję z analizowaniem pamięci sterty procesu, aby określić aktualną wartość ciągu w drugim procesie. Uzyskiwanie dostępu do pamięci sterty procesów i przechodzenie przez nią nie stanowi problemu. Jednak ponieważ wartość ciągu zmienia się i proces przydziela za każdym razem nową część pamięci, adres łańcucha zmienia się. Ponieważ ciąg ma ustalony format, nadal jest łatwy do znalezienia, ale po kilku zmianach stare wersje ciągu nadal znajdują się w pamięci sterty (prawdopodobnie zostały zwolnione, ale nadal nie są ponownie używane/nadpisywane), więc nie jestem w stanie powiedzieć, który ciąg jest aktualny.

Tak więc, aby nadal znaleźć bieżący, chcę sprawdzić, czy ciąg znajdujący się w pamięci jest nadal używany przez porównanie jego adresu z adresami malloc/free.

ciao, Elmar

+0

Oprócz mojej odpowiedzi poniżej, może to pomóc trochę http://www.linuxforums.org/forum/linux-programming-scripting/52375-reading-memory-other-processes.html –

+0

Możesz również chcieć wykopać w części pamięci dotyczącej mapowania jądra/glibc –

Odpowiedz

12

Istnieje wiele sposobów, w jaki malloc/free może przechowywać rozmiar obszaru pamięci. Na przykład może być przechowywany tuż przed obszarem zwróconym przez malloc. Lub może być przechowywany w tabeli odnośników w innym miejscu. Lub może być przechowywany niejawnie: niektóre obszary mogą być zarezerwowane dla określonych wielkości przydziałów.

Aby dowiedzieć się, jak to robi biblioteka C w systemie Linux (glibc), pobierz kod źródłowy z http://ftp.gnu.org/gnu/glibc/ i spójrz na plik malloc/malloc.c. Na górze znajduje się dokumentacja, która odnosi się do A Memory Allocator autorstwa Douga Lea.

+1

Ładne i zwięzłe, mam trudności z podążaniem za dziwną odpowiedzią Aidena, tak naprawdę nie sądzę, że tak odpowiedział. – RandomNickName42

1

Oczywiście zależy to od wdrożenia standardowej biblioteki. Najlepszym wyjściem byłoby przekopanie się przez źródło biblioteki (glibc jest domyślną wersją Linuksa) i sprawdzenie, czy potrafisz to rozgryźć. Prawdopodobnie nie będzie to banalne.

Powiązane problemy