【发布时间】:2011-12-15 15:54:45
【问题描述】:
有没有办法在 Linux 上检索 C 中的堆栈和堆使用情况?
我想知道堆栈/堆具体占用的内存量。
【问题讨论】:
-
valgrind将告诉您堆使用情况(即所有对malloc()的调用等)您需要某种堆栈分析器来获取有关堆栈使用情况的信息,尽管不太清楚是什么正是您正在寻找的。span>
有没有办法在 Linux 上检索 C 中的堆栈和堆使用情况?
我想知道堆栈/堆具体占用的内存量。
【问题讨论】:
valgrind 将告诉您堆使用情况(即所有对malloc() 的调用等)您需要某种堆栈分析器来获取有关堆栈使用情况的信息,尽管不太清楚是什么正是您正在寻找的。span>
如果你知道进程的 pid(例如 1234),你可以使用pmap 1234 命令,它会打印内存映射。您还可以读取/proc/1234/maps 文件(实际上是一个文本伪文件,因为它不存在于磁盘上;它的内容是由内核延迟合成的)。阅读proc(5) 手册页。它是特定于 Linux 的,但受到其他 Unix 系统上的/proc file systems 的启发。
(你最好快速打开、阅读、然后关闭那个伪文件;不要让文件描述符保持打开数秒;它更像是一个类似“管道”的东西,因为你需要顺序读取;它是一个不涉及实际磁盘 I/O 的伪文件)
您可以从程序内部读取/proc/self/maps 文件。尝试在终端中执行 cat /proc/self/maps 命令以查看运行该 cat 命令的 process 的 virtual address space 映射,并尝试使用 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。
【讨论】: