malloc_info()如何工作?

时间:2010-10-11 06:01:04

标签: c++ c gcc gnu

我一直在试图弄清楚malloc.h中的malloc_info()函数是如何工作的。我知道你必须传递一个FILE *并且还没有实现任何选项,但我对它实际报告的内容感到茫然!?此外,我编写了一个测试应用程序,分配了一大堆内存,并且malloc_info()报告的值不会改变,除非我做了20,000个1字节分配?

有没有人对malloc_info()有任何经验,并且可以了解它应该测量的内存的哪些方面?

应该注意的是,我可以在google上找到关于malloc_info()的任何内容,只是一些粗略的错误报告。

malloc_info()的输出示例:

<malloc version="1">
    <heap nr="0">
        <sizes>
        </sizes>
        <total type="fast" count="0" size="0"/>
        <total type="rest" count="0" size="0"/>
        <system type="current" size="135168"/>
        <system type="max" size="135168"/>
        <aspace type="total" size="135168"/>
        <aspace type="mprotect" size="135168"/>
    </heap>
    <total type="fast" count="0" size="0"/>
    <total type="rest" count="0" size="0"/>
    <system type="current" size="135168"/>
    <system type="max" size="135168"/>
    <aspace type="total" size="135168"/>
    <aspace type="mprotect" size="135168"/>
</malloc>

编辑:

作为进一步的解释;我的后备位置是mallinfo()函数,但我希望使用malloc_info()作为我可以收集的内容,它的目标是替换mallinfo()。我发现mallinfo()和malloc_info()的工作方式不同。在我的测试中,mallinfo()跟踪我的所有分配,而malloc_info()完全没有这样做。我只能假设malloc_info()当前已被破坏,或者它的目的不同于mallinfo()。

在omnifarious给出的文章中,有很好的理由应该弃用mallinfo():

  

它完全不适合64位计算机。数据类型   SysV规范要求不允许   对于大于2 ^ 31字节的值(全部   结构中的字段是整数)。该   第二个问题是数据   结构真的是特定的   malloc实现SysV用于   那个时候。

但是我认为目前malloc_info()还没有准备好接受它。

进一步编辑: 经过一番挖掘之后,似乎malloc_info()在所有出现135168的地方报告了mallinfo()的竞技场大小(至少这是它所对应的)。这似乎没那么有用,与mallinfo()允许的相比,它是一个非常一维的信息。

2 个答案:

答案 0 :(得分:1)

通常通过mmap /dev/zero告诉操作系统“我需要x个内存页面。”来处理大量分配。大于页面的分配或4(一页通常是4096字节)通常以这种方式处理,这些分配不是我期望的malloc诊断跟踪的东西。

不幸的是,我对malloc_info的了解不多。作为我们无法估量的glibc作者Ulrich Drepper的LJ post about the removal of mallinfo(以及其他内容),似乎是最好的信息,而且非常稀薄,无论如何你可能会发现谷歌。

program I pasted at paste.lisp.org应该通过它的步伐运行malloc并打印出堆信息。这是非常具体的Linux和gcc,当然,这个问题也是如此。也许摆弄测试程序的输出可以让你深入了解它所谈论的内容。

答案 1 :(得分:1)

仅提及linux man-pages项目为版本3.41提供了malloc_info的联机帮助页:

http://man7.org/linux/man-pages/man3/malloc_info.3.html