0

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

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

PPS:我使用的是 Linux (eOs)。

4

3 回答 3

3

Massif 是一个很棒的工具,它可以显示你的程序随着时间的推移使用了多少内存。但是,它有一些缺点:

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

如果你用你的程序运行 Massif,你可以运行

ms_print massif.out.1234 > output

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

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

祝你好运!

于 2013-10-30T07:15:36.550 回答
1

如果你使用的是 linux,使用一些命令你可以看到你的程序的内存消耗,比如

top -p Process id 
pmap pid 
ps aux

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

于 2013-10-28T23:42:08.310 回答
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。就我个人而言,我会说只是在您的程序中执行此机制并在内部捕获调用并计算您分配的内存。

于 2013-10-29T19:13:15.633 回答