任何对glibc malloc代码有一些基本想法的人都可以告诉我如何迭代所有竞技场并找出哪些是没有被释放的块,即它们的使用位被设置。我必须在退出流程时这样做。
或
更确定地说,如果我们有一个竞技场,我们可以访问其中分配的第一个块吗?
的问候, 卡皮尔
答案 0 :(得分: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。
答案 1 :(得分: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库)。
祝你的应用程序好运。
答案 2 :(得分:0)
这是一个BlackHat paper,它描述了用于内存堆分配的glibc内部结构。
arena.c
和malloc.c
来源是另一个值得关注的地方。
在代码中,main_arena
global是根。 main_arena.next
指向下一个竞技场(如果有的话),main_arena.bins
描述带有内存块的分档。