如何记录 malloc

BCS*_*BCS 4 memory malloc memory-management

这有点假设并且非常简化,但是......

假设一个程序将调用第三方编写的函数。可以假设这些方没有敌意,但不能假设为“有能力”。每个函数都会接受一些参数,有副作用并返回一个值。当它们不运行时,它们没有状态。

目标是通过记录所有 malloc(等)然后在函数退出后释放所有内容来确保它们不会导致内存泄漏。

这可能吗?这个实用吗?

ps 对我来说重要的部分是确保没有分配持续存在,因此在不这样做的情况下消除内存泄漏的方法对我没有用。

Jas*_*hen 5

首先,您必须为malloc()free()以及朋友提供入口点。因为此代码已经编译(对吗?),所以您不能依赖#define重定向。

然后,您可以以明显的方式实现这些,并通过将这些例程链接到这些模块来记录它们来自某个模块。

最快的方法根本不涉及任何日志记录。 如果他们使用的内存量是有限的,为什么不预先分配他们需要的所有“堆”并从中编写一个分配器呢?然后当它完成后,释放整个“堆”,你就完成了!如果它更复杂,您可以将这个想法扩展到多个堆。

如果您确实需要“记录”而不是创建自己的分配器,这里有一些想法。一,使用带有指针和内部链接的哈希表。另一种方法是在每个块前面分配额外的空间,并将您自己的结构放在那里,其中包含“日志表”中的索引,然后保留日志表条目的空闲列表(作为堆栈,以便获得一个空闲的条目)或者将一个空闲的放回去是 O(1))。这需要更多内存,但速度应该很快。

实用吗?我认为是的,只要速度打击是可以接受的。


DGe*_*try 5

您没有指定操作系统或环境,此答案假定 Linux、glibc 和 C。

您可以将 __malloc_hook、__free_hook 和 __realloc_hook 设置为指向将分别从 malloc()、realloc() 和 free() 调用的函数。__malloc_hook 联机帮助页显示了原型。您可以在这些钩子中添加轨道分配,然后返回让 glibc 处理内存分配/释放。

听起来您想在第三方函数返回时释放任何实时分配。有一些方法可以让 gcc 使用 -finstrument-functions 在每个函数入口和出口处自动插入调用,但我认为这对于您尝试做的事情来说是不雅的。在调用这些第三方函数之一后,您是否可以让自己的代码调用内存跟踪库中的函数?然后,您可以检查是否有第三方函数尚未释放的任何分配。