如何在Linux上使用C语言检查堆栈的使用情况?

4
有没有办法在Linux上使用C语言检索堆栈和堆使用情况?
我想知道堆栈/堆所占用的内存量。

1
valgrind 会告诉你关于堆使用情况的信息(即所有对 malloc() 等函数的调用)。但是,如果你想获取有关栈使用情况的信息,你需要一些类型的堆栈分析器,尽管不太清楚你具体要查找什么。 - Kerrek SB
也许你正在寻找的是"在gdb中检查C/C++堆内存统计信息" - Mickael Ciocca
1个回答

5
如果您知道进程的pid(例如1234),则可以使用pmap 1234命令,该命令会打印内存映射。您还可以阅读/proc/1234/maps文件(实际上是一个文本伪文件,因为它不存在于磁盘上;其内容由内核懒惰地合成)。请阅读proc(5)手册。它是Linux特定的,但受其他Unix系统上的/proc文件系统启发。
(最好快速打开、阅读、然后关闭该伪文件;不要保持文件描述符打开多秒钟;它更像是一个“管道”类型的东西,因为您需要按顺序读取它;它是一个伪文件,没有实际的磁盘I/O涉及)

从程序内部,您可以读取/proc/self/maps文件。在终端中尝试使用cat /proc/self/maps命令,以查看运行该cat命令的进程虚拟地址空间映射,以及cat /proc/$$/maps以查看当前shell的映射。

所有这些都为您提供了一个进程的内存映射,并且其中包含其使用的各种内存段(特别是用于堆栈、堆和各种动态库的空间)。

您还可以使用getrusage系统调用。

请注意,在多线程中,进程的每个线程都有自己的调用堆栈

你还可以解析/proc/$pid/statm/proc/self/statm伪文件,或者/proc/$pid/status/proc/self/status伪文件。但是,参见Linux Ate my RAM获取一些提示。

考虑使用valgrind(至少在Linux上)调试内存泄漏


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