无法在C程序中检测到巨大的内存使用情况



我在运行我的C程序时遇到了巨大的内存使用。它使用的内存比预期的要多。甚至操作系统有时也不得不因为内存占用太多而终止进程(我的机器上有20GB的RAM)。我尝试运行valgrind,看看是否有一些关于内存使用情况的线索。在valgrind输出中,我可以看到一个可能指向该问题的警告:

==69541== Warning: set address range perms: large range [0x76eb040, 0x2cb27240) (undefined)

然而,我不知道如何知道这些大范围的内存被分配到哪里。

希望这不是一个太笼统的问题。我尽量提供最少的细节来解决问题,但如果需要,我可以提供更多的信息。

你应该在——leak-check=full时使用Valgrind选项并使用-g编译代码选择

的例子:

cat my_leak.c ; gcc -g my_leak.c ; valgrind --leak-check=full a.out
#include <malloc.h>
int main() {
char* a = malloc(1000000);
return 0;
}
==29805== Memcheck, a memory error detector
==29805== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==29805== Using Valgrind-3.15.0 and LibVEX; rerun with -h for copyright info
==29805== Command: a.out
==29805== 
==29805== error calling PR_SET_PTRACER, vgdb might block
==29805== 
==29805== HEAP SUMMARY:
==29805==     in use at exit: 1,000,000 bytes in 1 blocks
==29805==   total heap usage: 1 allocs, 0 frees, 1,000,000 bytes allocated
==29805== 
==29805== 1,000,000 bytes in 1 blocks are definitely lost in loss record 1 of 1
==29805==    at 0x483B7F3: malloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==29805==    by 0x10915E: main (my_leak.c:4)
==29805== 
==29805== LEAK SUMMARY:
==29805==    definitely lost: 1,000,000 bytes in 1 blocks
==29805==    indirectly lost: 0 bytes in 0 blocks
==29805==      possibly lost: 0 bytes in 0 blocks
==29805==    still reachable: 0 bytes in 0 blocks
==29805==         suppressed: 0 bytes in 0 blocks
==29805== 
==29805== For lists of detected and suppressed errors, rerun with: -s
==29805== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)

Valgrind版本:

valgrind --version
valgrind-3.15.0

当Valgrind在大于256mb的新内存范围上设置权限时,将生成您复制的消息。如此大的分配有点可疑,可能是内存大小计算中的错误。

在您的示例中,分配是625197568字节(约596Mbytes)。

您可以使用massif工具查看分配的位置(或非valgrind工具,如heaptrack)。

我找到了问题所在。我在这里发布了我使用和为我工作的方法,以防它可能对其他人有用(尽管可能不是最简洁的方法)。

使用调试器,我发现了发生大量分配的地方(这花费了很多时间)。然后我意识到我正在创建一个哈希表对象,它的大小是作为参数传递的。我没有传递参数,所以程序取了一个垃圾(大)数作为大小。

感谢所有人分享你对我的问题的想法:)

最新更新