检查我的程序使用多少内存

时间:2013-10-28 23:11:30

标签: memory

我的计算机上运行了一个C代码程序,我需要检查程序运行时使用的内存量。我有什么工具可以使用吗?

PS:地块工具(valgrind)在这种情况下有效吗?我已经运行了它,但我不知道如何解释它创建的图形。

PPS:我正在使用Linux(eOs)。

3 个答案:

答案 0 :(得分:3)

Massif是一个很棒的工具,可以显示程序一段时间内使用的内存量。但它有一些缺点:

  • 所有Valgrind工具都很慢;如果你的程序很慢,Massif会进一步放慢速度(我认为是十倍)。
  • 您必须重新启动程序才能使用它,如果您的程序已在运行,则无法使用Valgrind(和Massif)拦截它。
  • 如果希望Massif报告显示代码内存的使用位置,则必须使用'-g'标记编译程序。

如果您使用程序运行Massif,则可以运行

ms_print massif.out.1234 > output

你基本上不需要'输出'部分,但我发现用更少(或其他一些文本文件阅读器)解释结果比仅滚动终端历史更容易。在输出的顶部,您将看到内存消耗随时间变化的图表。在下面,您将看到来自任意时间间隔的一些快照,您可以在这些快照中找到占用大部分内存的代码中的位置。

有一些图形工具可以解释Massif结果,但我从未觉得我需要它们。研究ms_print的报告,您将学会解释其结果。

祝你好运!

答案 1 :(得分:1)

如果您使用的是linux,使用某些命令可以看到程序的内存消耗,例如

top -p Process id 
pmap pid 
ps aux

您可以使用Valgrind的memcheck工具检查简单的内存消耗。 要解释地块图,您应该阅读详细的手册。 如果你在Windows中,我想你的任务经理将是一个很好的帮助。浏览此article以供参考。

答案 2 :(得分:0)

一种方法是捕获对malloc,realloc,calloc等堆函数的所有调用,然后总计总大小。如果你的程序中没有这个机制,你仍然可以通过使用linux的LD_PRELOAD机制在不改变程序的情况下执行此操作。你只需要编译一个小的共享库, 具有以下功能

 void* malloc (size_t size);
 void* calloc (size_t num, size_t size);  
 void* realloc (void* ptr, size_t size);

然后你可以实现捕获大小的函数

 void* malloc (size_t size) {
     totalCount +=  size;
     real_malloc (size_t size)
 }

有关实施的详细信息,您还可以查看之前的答案Overriding malloc with LD_PRELOAD。我个人会说你只是在你的程序中执行这个机制并在内部捕获调用并计算你分配的内存。