我正在 Linux 中的 C++ 程序中工作。现在我想检查内存是如何在我的程序中分配的。由于我使用的库很复杂,我无法手动估计。
我在网上搜索了一下。有人建议使用 valgrind。我使用它,但它使我的程序崩溃。也有人使用 getrusage ( http://linux.die.net/man/2/getrusage ),但我发现很多负面评论。
有人对此有建议吗?
我正在 Linux 中的 C++ 程序中工作。现在我想检查内存是如何在我的程序中分配的。由于我使用的库很复杂,我无法手动估计。
我在网上搜索了一下。有人建议使用 valgrind。我使用它,但它使我的程序崩溃。也有人使用 getrusage ( http://linux.die.net/man/2/getrusage ),但我发现很多负面评论。
有人对此有建议吗?
如果您的内存是由 malloc 分配的,那么来自 gdb(或您的代码):
(gdb) 调用 malloc_stats()
http://www.gnu.org/software/libc/manual/html_node/Statistics-of-Malloc.html
3.2.2.11 malloc 内存分配统计
您可以通过调用 mallinfo 函数获取有关动态内存分配的信息。此函数及其相关数据类型在 malloc.h 中声明;它们是标准 SVID/XPG 版本的扩展。
— 数据类型:struct mallinfo
此结构类型用于返回有关动态内存分配器的信息。它包含以下成员:
int arena
这是 malloc 用 sbrk 分配的内存的总大小,以字节为单位。
int ordblks
这是未使用的块数。(内存分配器在内部从操作系统获取内存块,然后将它们分割以满足单独的 malloc 请求;请参阅 Efficiency 和 Malloc。)
int smblks
该字段未使用。
int hblks
这是使用 mmap 分配的块的总数。
int hblkhd
这是使用 mmap 分配的内存的总大小,以字节为单位。
int usmblks
该字段未使用。
int fsmblks
该字段未使用。
int uordblks
这是由 malloc 分发的块所占用的内存的总大小。
int fordblks
这是空闲(未使用)块占用的内存总大小。
int keepcost
这是通常与堆末端(即虚拟地址空间数据段的高端)接壤的最高可释放块的大小。
— 函数:struct mallinfo mallinfo (void)
此函数以struct mallinfo 类型的结构返回有关当前动态内存使用情况的信息。