我的计算机上运行了一个C代码程序,我需要检查程序运行时使用的内存量。我有什么工具可以使用吗?
PS:地块工具(valgrind
)在这种情况下有效吗?我已经运行了它,但我不知道如何解释它创建的图形。
PPS:我正在使用Linux(eOs)。
答案 0 :(得分:3)
Massif是一个很棒的工具,可以显示程序一段时间内使用的内存量。但它有一些缺点:
如果您使用程序运行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。我个人会说你只是在你的程序中执行这个机制并在内部捕获调用并计算你分配的内存。