首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在glibc malloc中遍历所有区域中的所有块。

在glibc malloc中遍历所有区域中的所有块。
EN

Stack Overflow用户
提问于 2011-11-17 09:37:06
回答 3查看 1.1K关注 0票数 4

有谁对glibc代码有一些基本的了解,请告诉我如何在所有的竞技场上迭代,找出哪些块没有被释放,即设置了它们的无用位。这是我必须在退出过程的时候做的。

更确切地说,如果我们有一个竞技场,我们能访问其中分配的第一个块吗?

谢谢大家抽出时间来回复。我很久以前发过这个问题。有一些黑客技术列出在那里的问题。我从中受益。

你好,卡皮尔

EN

回答 3

Stack Overflow用户

发布于 2012-04-13 15:37:13

所有主要的c代码分析器通常都有某种类型的malloc包装器,用于内存跟踪。对于跟踪内存并使其独立于平台,您可能需要做同样的事情(如果不是类似的事情)。

下面是一些示例:

跟踪malloc分配了多少内存

简单的C实现来跟踪内存malloc/free?

您必须添加额外的结构来存储分配的内存引用,这样您就可以返回并迭代它们。我想你会想要阅读与内存清理相关的算法。标记N扫描和参考计数是当今最流行的算法。JVM使用Mark扫描。您还必须研究强链接和弱链接场景,以及它们如何应用于您的GC。

否则,如果您想节省时间而不编写自己的包装器,那么可以使用valgrind和gprof这样的工具来分析和评估内存使用情况。

老实说,我会去看看Boehm-Demers-Weiser垃圾收集人。它已经写好了,并以广泛的研究为基础。

刚刚注意到BDWGC转移到了GitHub

票数 5
EN

Stack Overflow用户

发布于 2012-04-09 23:16:08

基于这个问题的表述,看来您正在尝试重新发明一种与扫痕类似的算法,用于使用滑翔进行垃圾收集。这一努力是崇高的,但存在垃圾收集器为了满足这一需求非常整洁,如果这确实是您的最终目标,那么参考它们将为您节省大量的重新实现工作。

同时,您需要C规范中不存在的功能,并在glibc 有点困难和烦躁中实现它。如果您希望继续推进您的实现,因为不同版本提供了非常不同的分配程序级别的保证,那么您需要参考本地glibc版本的malloc/malloc.c来确定正确的策略。这可以通过在分配器上装载代码来完成,但这似乎并不是解决您所表达的问题的理想解决方案。

尽管沉浸在C++中,但这条线包含了关于如何编写自己的内存管理器和如何评估一个良好的参考实现的宝贵信息,如果您不想将自己束缚在glibc的内部,这是一种更可行的策略。我强烈建议这一策略,因为它将对您的应用程序进行验证,并抽象出您想要的功能(从而允许您在将来进入不同的C库)。

祝你的申请好运。

票数 1
EN

Stack Overflow用户

发布于 2012-12-20 13:46:30

下面是一个BlackHat纸,它很好地描述了用于内存堆分配的glibc内部结构。

arena.cmalloc.c资源是另一个值得一看的地方。

在代码中,main_arena全局是根。main_arena.next指向下一个竞技场(如果有的话),main_arena.bins用内存块描述垃圾箱。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8164930

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档