【问题标题】:How to determine free memory within a program running on Linux?如何确定在 Linux 上运行的程序中的空闲内存?
【发布时间】:2010-12-05 02:46:34
【问题描述】:

我有一个在 Linux 上运行的软件正在泄漏内存。这是一个嵌入式系统,所以我没有很多调试工具,所以我使用的是 printf。

没有像 'popen()' 调用 'cat /proc/meminfo' 并扫描 MemFree 行,有没有办法可以将这些信息放入 printf 中?

目前我正在做类似的事情:

# ./myprogram &
# for (( c=0; c<99; c++)) do echo --- $c --- && cat /proc/meminfo | grep MemFree: && sleep 30; done;

没关系,但我想知道是否有更好的方法。


编辑:到目前为止的四个回复并不是我想要的,我不够具体。

看来我的程序不是内存泄漏的原因;不管我想看看是否可以添加一些“c”代码来查看/报告系统中的可用内存,而不是我的代码(进程)正在使用多少内存。

【问题讨论】:

    标签: linux memory-leaks


    【解决方案1】:

    两个可能有用的库调用:

    • getrusage 将让您获得当前程序(以及可选的子进程)驻留集大小;

    • sbrk(0) 将返回程序中断的当前位置,该位置会随着程序堆大小的增加而增加。

    【讨论】:

    • 有用的工具本身;但也没有解决我正在寻找的东西,一个可以报告可用物理内存大小的 c 可调用例程。
    【解决方案2】:

    watch 命令很有用,试试例如

    watch -n 1 ps v `pgrep ./myprogram`
    

    但您当然也可以尝试告诉tophtop 和它们的图形变体来观察您的过程。

    否则,您可以通过查询自己的进程 ID、查找 /proc/$PID 并从那里读取内存信息来尝试相同的操作,以便您的 printf 可以在运行时报告它们。

    【讨论】:

    • '正在寻找一个可以报告可用物理内存大小的 c 可调用例程。
    【解决方案3】:

    您确定要查看可用系统内存吗? 在大多数 unix 平台上,该值将始终趋于零。 原因: - 文件系统块被缓存,以防有人再次需要它们 - 仅当某些进程需要内存时才释放块 - 这些块受到青睐,因为后备存储是文件系统, 所以窃取这些块很便宜......不需要分页。

    【讨论】:

      【解决方案4】:

      您可以尝试使用 mallinfo(虽然它有些过时了......我已经成功使用过一次) http://scaryreasoner.wordpress.com/2007/10/17/finding-memory-leaks-with-mallinfo/

      另外,njamd(或电子围栏,或任何其他基于 LD_PRELOAD 的 malloc 调试器可能会有所帮助): http://sourceforge.net/projects/njamd/

      另外,mtrace 可能也很有趣: http://en.wikipedia.org/wiki/Mtrace

      【讨论】:

        猜你喜欢
        • 2014-04-06
        • 2010-10-25
        • 1970-01-01
        • 1970-01-01
        • 2011-06-06
        • 2013-07-19
        • 2010-11-22
        • 2021-10-08
        • 2019-11-12
        相关资源
        最近更新 更多