无法检测到 C 程序中的大量内存使用情况
Can't detect huge memory usage in C program
我在 运行我的 C 程序中使用了大量内存。它使用的内存比预期的要多。即使是 OS 有时也会因为大量内存使用而终止进程(我的机器中有 20GB RAM)。我尝试 运行 valgrind 看看是否有一些关于内存使用情况的线索。在 valgrind 输出中,我可以看到一条可能指向问题的警告:
==69541== Warning: set address range perms: large range [0x76eb040, 0x2cb27240) (undefined)
但是,我不知道如何知道这个大范围的内存分配在哪里。
希望这不是一个太笼统的问题。我试图提供解决问题的最少细节,但如果需要,我可以提供更多信息。
只要 Valgrind 对大于 256 兆字节的新内存范围设置权限,就会生成您复制的消息。如此大的分配有点可疑,可能是内存大小计算中的错误。
在你的例子中,分配是 625197568 字节(约 596MB)。
您可以使用 massif
工具查看它的分配位置(或非 Valgrind 工具,如 heaptrack)。
您应该使用带有 --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
我找到了问题所在。我 post 这里是我使用和为我工作的方法,以防万一它可能对其他人有用(尽管可能不是最简洁的方法)。
我使用调试器发现了进行大量分配的地方(这花费了很多时间)。然后我意识到我正在创建一个 hash-table 对象,它的大小作为参数传递。我没有传递参数,所以程序将垃圾(大)数字作为大小。
感谢所有对我的问题发表看法的人:)
我在 运行我的 C 程序中使用了大量内存。它使用的内存比预期的要多。即使是 OS 有时也会因为大量内存使用而终止进程(我的机器中有 20GB RAM)。我尝试 运行 valgrind 看看是否有一些关于内存使用情况的线索。在 valgrind 输出中,我可以看到一条可能指向问题的警告:
==69541== Warning: set address range perms: large range [0x76eb040, 0x2cb27240) (undefined)
但是,我不知道如何知道这个大范围的内存分配在哪里。
希望这不是一个太笼统的问题。我试图提供解决问题的最少细节,但如果需要,我可以提供更多信息。
只要 Valgrind 对大于 256 兆字节的新内存范围设置权限,就会生成您复制的消息。如此大的分配有点可疑,可能是内存大小计算中的错误。
在你的例子中,分配是 625197568 字节(约 596MB)。
您可以使用 massif
工具查看它的分配位置(或非 Valgrind 工具,如 heaptrack)。
您应该使用带有 --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
我找到了问题所在。我 post 这里是我使用和为我工作的方法,以防万一它可能对其他人有用(尽管可能不是最简洁的方法)。
我使用调试器发现了进行大量分配的地方(这花费了很多时间)。然后我意识到我正在创建一个 hash-table 对象,它的大小作为参数传递。我没有传递参数,所以程序将垃圾(大)数字作为大小。
感谢所有对我的问题发表看法的人:)