GCC在64位平台上的基本堆使用统计数据

8
我需要回答一个基本问题,就是在由GCC编译的Linux C程序中,堆内存有多少被使用了(由malloc分配),还有多少空闲块。标准库的GNU实现有一个名为mallinfo的函数可以报告我需要的确切信息,但它只适用于32位配置,并且据我所知,没有64位等效功能(顺便问一句,有人知道为什么吗?)。
我在Linux上使用GCC,因此我需要这个功能。但我认为堆对系统是不透明的,所以回答这个问题的唯一方法是使用标准库实现提供的手段。
在Windows平台上的MSVC实现中,没有与mallinfo函数相当的函数,但有所谓的堆遍历功能,它允许通过迭代堆中的所有块来计算必要的信息。据我所知,GNU C库中没有堆遍历接口。(有吗?)
那么,在GCC中该怎么做呢?它不必高效,也就是说,上述基于堆遍历的方法对我来说完全可以胜任。在GCC中如何找出有多少堆被使用,有多少是空闲的?我可能会尝试安装malloc-hooks并“手动”跟踪大小,尽管我不确定如何确定当前堆场大小(请参见mallinfo.arena)而不使用mallinfo。

这个链接是否能够涵盖你所讨论的内容:http://www.aquaphoenix.com/ref/gnu_c_library/libc_31.html? - Yktula
可能会……但是我的GCC版本不知道mstats。此外,您链接的文档与GNU网站http://www.gnu.org/s/libc/manual/html_node/index.html#toc_Memory上提供的类似文档不同,在后者中,`mstats`被替换为`mallinfo`。我猜测您的链接指向了某个过时的GNU C库版本。 - AnT stands with Russia
1个回答

3

这篇2004年的帖子涉及关键的glibc开发人员,表明由于接口已经"...根本不适合实现。",因此没有必要制作它的64位清理版本。(mallinfo()接口并非为glibc设计的-正在考虑将其包含在SUS中)。

根据您对信息的需求,您可能可以使用malloc_stats(),它只会在标准错误输出文本 - 由于它只是文本输出,所以它能够更改以匹配malloc()的内部实现,并且因此至少具有产生合理结果的优势。


我明白mallinfo的某些字段可能对于不同的实现来说毫无意义,但是确定当前堆利用率(作为实际使用的堆内存与当前从系统分配的内存的百分比)的问题似乎是在现实生活中合理出现的。这不一定是立即可用的东西(例如mallinfo)。无论如何,我的问题只是一个问题:有办法吗? - AnT stands with Russia
1
我只是在回答“(anyone knows why?)”这个子问题……除非malloc_stats()能够满足你的需求。 - caf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接