相关疑难解决方法(0)

如何迭代所有malloc块(glibc)

我正在尝试迭代所有领域中的所有malloc_chunk。(基于核心文件进行调试,以进行内存泄漏和内存损坏调查)

据我所知,每个竞技场都有top_chunk,它指向一个竞技场内的顶部块,基于top_chunk,在其内部,基于代码(glibc / malloc / malloc.c)有prev_sizesize在此处输入图片说明 我可以获取之前的连续块,然后在一个区域中循环所有块。(我可以统计带有大小和数量的块,例如WinDBG:!heap -stat -h),也可以基于prev_sizesize来检查块是否损坏。

在arena(malloc_state)中,有一个成员变量:next指向下一个arena。然后,我可以循环所有竞技场的块。

但是我遇到的一个问题是,如果未分配块,则prev_size无效,如何获取先前的malloc_chunk?否则这种方式是不正确的。


问题背景:

我们遇到的内存泄漏错误是几个在线数据节点(我们的项目是分布式存储集群)中报告的内存泄漏。

我们的工作和结果:

  1. 我们使用valrgind重现测试集群中的错误,但不幸的是我们什么也没得到。

  2. 我试图研究有关堆的更多信息,试图分析堆块并遵循我以前在WinDBG中所做的方式(有非常有趣的堆命令来挖掘内存泄漏和内存损坏),但是我被问题所阻止我问。

  3. 我们使用valgrind-massif来分析分配(我认为这非常详细和有趣,可以显示哪个分配占用了多少内存)。Massif显示了一些线索,我们遵循了这一条并检查了代码,最终发现了泄漏(一张地图非常大,并且使用不当,但是我会删除holder类的析构函数,这就是为什么valgrind不报告此问题)。

我将进一步挖掘gdb-heap源代码,以更多地了解glic malloc结构。

c++ debugging malloc gdb

5
推荐指数
1
解决办法
763
查看次数

标签 统计

c++ ×1

debugging ×1

gdb ×1

malloc ×1