2011-11-17 74 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描述与内存块的垃圾箱。