【发布时间】:2019-09-30 23:17:45
【问题描述】:
我编写了一个程序,它的内存占用会随着时间的推移而增长。它最终会消耗所有可用的系统内存,然后使系统崩溃。
我正在尝试确定似乎是内存泄漏的来源。我已经在代码上运行了 Valgrind。它报告没有明确或间接丢失的记忆。它确实列出了可能丢失的记忆,但没有很清楚。我可以就如何追踪此问题提出一些建议。
==13049== HEAP SUMMARY:
==13049== in use at exit: 2,240,095 bytes in 3,720 blocks
==13049== total heap usage: 50,296 allocs, 46,576 frees, 768,607,751 bytes allocated
==13049==
==13049== Searching for pointers to 3,720 not-freed blocks
==13049== Checked 56,807,736 bytes
==13049==
==13049== Thread 1:
==13049== 64 bytes in 4 blocks are possibly lost in loss record 1 of 11
==13049== at 0x4844F70: malloc (in /usr/lib/valgrind/vgpreload_memcheck-arm64-linux.so)
==13049==
{
<insert_a_suppression_name_here>
Memcheck:Leak
match-leak-kinds: possible
fun:malloc
}
==13049== 184 bytes in 1 blocks are possibly lost in loss record 2 of 11
==13049== at 0x48472C4: realloc (in /usr/lib/valgrind/vgpreload_memcheck-arm64-linux.so)
==13049==
{
<insert_a_suppression_name_here>
Memcheck:Leak
match-leak-kinds: possible
fun:realloc
}
==13049== 520 bytes in 20 blocks are possibly lost in loss record 3 of 11
==13049== at 0x48473FC: memalign (in /usr/lib/valgrind/vgpreload_memcheck-arm64-linux.so)
==13049==
{
<insert_a_suppression_name_here>
Memcheck:Leak
match-leak-kinds: possible
fun:memalign
}
==13049== 643 bytes in 11 blocks are still reachable in loss record 4 of 11
==13049== at 0x4845DFC: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-arm64-linux.so)
==13049==
{
<insert_a_suppression_name_here>
Memcheck:Leak
match-leak-kinds: reachable
fun:_Znam
}
==13049== 944 bytes in 47 blocks are still reachable in loss record 5 of 11
==13049== at 0x4844F70: malloc (in /usr/lib/valgrind/vgpreload_memcheck-arm64-linux.so)
==13049==
{
<insert_a_suppression_name_here>
Memcheck:Leak
match-leak-kinds: reachable
fun:malloc
}
==13049== 3,408 bytes in 19 blocks are possibly lost in loss record 6 of 11
==13049== at 0x48470CC: calloc (in /usr/lib/valgrind/vgpreload_memcheck-arm64-linux.so)
==13049==
{
<insert_a_suppression_name_here>
Memcheck:Leak
match-leak-kinds: possible
fun:calloc
}
==13049== 5,056 bytes in 7 blocks are still reachable in loss record 7 of 11
==13049== at 0x48472C4: realloc (in /usr/lib/valgrind/vgpreload_memcheck-arm64-linux.so)
==13049==
{
<insert_a_suppression_name_here>
Memcheck:Leak
match-leak-kinds: reachable
fun:realloc
}
==13049== 37,304 bytes in 185 blocks are still reachable in loss record 8 of 11
==13049== at 0x48470CC: calloc (in /usr/lib/valgrind/vgpreload_memcheck-arm64-linux.so)
==13049==
{
<insert_a_suppression_name_here>
Memcheck:Leak
match-leak-kinds: reachable
fun:calloc
}
==13049== 97,782 bytes in 1,739 blocks are still reachable in loss record 9 of 11
==13049== at 0x48456C8: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-arm64-linux.so)
==13049==
{
<insert_a_suppression_name_here>
Memcheck:Leak
match-leak-kinds: reachable
fun:_Znwm
}
==13049== 124,585 bytes in 1,666 blocks are still reachable in loss record 10 of 11
==13049== at 0x4845040: malloc (in /usr/lib/valgrind/vgpreload_memcheck-arm64-linux.so)
==13049==
{
<insert_a_suppression_name_here>
Memcheck:Leak
match-leak-kinds: reachable
fun:malloc
}
==13049== 1,969,605 bytes in 21 blocks are still reachable in loss record 11 of 11
==13049== at 0x48473FC: memalign (in /usr/lib/valgrind/vgpreload_memcheck-arm64-linux.so)
==13049==
{
<insert_a_suppression_name_here>
Memcheck:Leak
match-leak-kinds: reachable
fun:memalign
}
==13049== LEAK SUMMARY:
==13049== definitely lost: 0 bytes in 0 blocks
==13049== indirectly lost: 0 bytes in 0 blocks
==13049== possibly lost: 4,176 bytes in 44 blocks
==13049== still reachable: 2,235,919 bytes in 3,676 blocks
==13049== of which reachable via heuristic:
==13049== newarray : 1,536 bytes in 16 blocks
==13049== suppressed: 0 bytes in 0 blocks
Valgrind 被调用:
valgrind --child-silent-after-fork=yes --smc-check=stack --tool=memcheck --gen-suppressions=all --track-origins=yes --leak-check=full --num-callers=500 --leak-check=full --show-leak-kinds=all -v --show-reachable=yes /opt/fsoapp/bin/fsoapp
【问题讨论】:
-
一般情况下,您希望增加回溯并显示它的分配位置。
-
您仍然可以访问这么多内存的事实意味着您没有正常意义上的泄漏。您只是在使用大量内存。您需要查看您的程序,看看您可以丢弃哪些内容以减少内存占用。
-
@o11c,我已经有了 --num-callers=500,所以我应该看到 Valgrind 愿意向我展示的所有内容。
-
你在构建时是否开启了调试符号?
-
你可以让一个囤积者获取越来越多的内存并将你耗尽而不会留下任何明显的痕迹,因为在破坏时它确实会归还所有分配的内存。然后当程序退出并且 Valgrind 开始计数时,一切都很正常。
标签: c++ qt5 valgrind xilinx petalinux