【问题标题】:How to check stack and heap usage with C on Linux?如何在 Linux 上使用 C 检查堆栈和堆的使用情况?
【发布时间】:2011-12-15 15:54:45
【问题描述】:

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

我想知道堆栈/堆具体占用的内存量。

【问题讨论】:

  • valgrind 将告诉您堆使用情况(即所有对malloc() 的调用等)您需要某种堆栈分析器来获取有关堆栈使用情况的信息,尽管不太清楚是什么正是您正在寻找的。​​span>

标签: c stack


【解决方案1】:

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

(你最好快速打开、阅读、然后关闭那个伪文件;不要让文件描述符保持打开数秒;它更像是一个类似“管道”的东西,因为你需要顺序读取;它是一个不涉及实际磁盘 I/O 的伪文件)

您可以从程序内部读取/proc/self/maps 文件。尝试在终端中执行
cat /proc/self/maps 命令以查看运行该 cat 命令的 processvirtual 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

【讨论】:

    猜你喜欢
    • 2018-10-11
    • 2018-12-11
    • 2012-05-09
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-13
    • 2014-10-17
    相关资源
    最近更新 更多