2011-11-17 73 views
2

任何對glibc malloc代碼有一些基本概念的人都可以告訴我如何遍歷所有的區域並找出哪些區塊沒有被釋放,即它們的使用位已設置。在退出流程時,我必須這樣做。遍歷glibc malloc中的所有區塊中的所有區塊

更多的確定性,如果我們有一個舞臺,我們可以訪問它分配的第一塊?


感謝大家抽出時間和迴應。我很久以前發佈了這個問題。 「Phrack」在那裏列出了一些黑客技術問題。我受益於此。

問候, 卡皮爾

+0

只是爲了清晰:我相信這裏的慾望是決定內存_without的unfreed和使用區域的寫作上的glibc的頂部的獨立分配_這裏的下意識的解決方案是顯而易見的:寫(或借)覆蓋內存管理器並用它來處理這種情況。 – MrGomez

+0

你想得到多低的水平?內存管理API和系統調用在編譯器和平臺上是不同的。 Windows,Linux,Mac OS X等......堆分配函數(如malloc)建立在這些系統調用之上。 –

回答

1

基於這一問題的提法,看來你試圖重塑一個算法並不像mark-sweep使用glibc垃圾收集。這種努力是高貴的,但garbage collectors exist能夠很好地滿足這種需求,如果這確實是您的最終目標,那麼提及它們將爲您節省大量的重新實施工作。

同時,您希望的功能doesn't exist in the C specification,並在glibc is somewhat difficult and hacky中實現它。如果您希望繼續推進您的實施,那麼您需要諮詢當地的glibc版本malloc/malloc.c以確定正確的策略,因爲不同的版本提供了非常不同的分配器級別保證。它可以通過在分配器上搭載代碼來完成,但這似乎並不是解決所表達問題的理想方案。

儘管在C++中被浸泡,this thread包含的信息如何編寫自己的內存管理器以及如何評價一個很好的參考實現,這是如果你不想自己拴到一個更可行的戰略寶庫glibc的內部。我會強烈建議這個策略,因爲它可以面向未來的應用程序並提取您所需的功能(從而允許您將來放入不同的C庫)。

祝您的程序(s)好運。

5

所有主要的c代碼分析器通常都有一些圍繞malloc進行內存跟蹤的包裝。如果不是跟蹤內存並使其與平臺無關,那麼您可能必須執行相同的操作。

下面是一些例子:

keeping track of how much memory malloc has allocated

Simple C implementation to track memory malloc/free?

你將不得不增加額外的結構用於存儲分配的內存引用,這樣你就可以回去,並在它們之間迭代。我想你會想閱讀與內存清理有關的算法。 Mark N Sweep和Reference-Counting是當今最流行的算法。 JVM使用Mark N Sweep。您還必須研究強大和薄弱的連接方案,以及它們如何應用於GC。否則,如果您想節省時間而不編寫自己的包裝,可以使用像valgrind和gprof這樣的工具來分析和評估內存使用情況。

老實說我會退房Boehm-Demers-Weiser Garbage Collecter。它已經寫入並且基於廣泛的研究。

剛注意到BDWGC移到GitHub

+0

嗯。這是[一般垃圾收集策略(https://en.wikipedia.org/wiki/Garbage_collection_(computer_science))更加有用的概述,但我擔心(在我自己的答案)的OP和賞金提供者想要直接使用glibc分配器的東西。我喜歡這種情況,但我認爲這個答案還有擴展的空間。如果我以自己的方式這樣做,那麼您會因爲良性競爭的性質而特別擔憂嗎? – MrGomez

0

這是一個BlackHat paper,其中詳細介紹了用於內存堆分配的glibc內部結構。
arena.cmalloc.c來源是另一個值得關注的地方。

在代碼中,全局是main_arenamain_arena.next指向下一個競技場(如果有的話),main_arena.bins描述與內存塊的垃圾箱。