如何在Linux上使用C检查堆栈和堆使用情况?

时间:2011-10-26 11:29:08

标签: c stack

有没有办法在Linux上的C中检索堆栈和堆使用?

我想知道堆栈/堆专门占用的内存量。

1 个答案:

答案 0 :(得分:4)

如果您知道进程的pid(例如1234),则可以使用pmap 1234命令打印内存映射。您还可以阅读/proc/1234/maps文件(实际上是文本伪文件,因为它不存在于磁盘上;其内容由内核懒惰地合成)。阅读proc(5)手册页。它是特定于Linux的,但在其他Unix系统上受/proc file systems的启发。

(你最好打开,读取,然后快速关闭那个伪文件;不要让文件描述符在它上面打开很多秒;它更像是一个“管道”的东西,因为你需要按顺序读取它;它是一个没有实际磁盘I / O的伪文件)

从程序内部,您可以阅读/proc/self/maps文件。尝试在终端中使用cat /proc/self/maps命令查看virtual address space运行该cat命令的process地图,并cat /proc/$$/maps查看地图你当前的shell。

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

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

另请注意,使用多线程时,流程的每个thread都有自己的call stack

您还可以解析/proc/$pid/statm/proc/self/statm伪文件,或/proc/$pid/status/proc/self/status伪文件。

但请参阅Linux Ate my RAM以获取一些提示。

考虑使用valgrind(至少在Linux上)来调试memory leaks