如何让Valgrind准确显示错误发生的位置?我通过添加-g调试选项编译了我的程序(通过PuTTy在Linux终端上的Windows机器上)。
当我运行Valgrind时,我得到了Leak和Heap摘要,我肯定已经丢失了内存,但我从未获得有关它发生的位置的信息(文件名,行)。在我分配内存后,Valgrind不应该告诉我它在哪一行上,它以后无法解除分配?
==15746==
==15746== HEAP SUMMARY:
==15746== in use at exit: 54 bytes in 6 blocks
==15746== total heap usage: 295 allocs, 289 frees, 11,029 bytes allocated
==15746==
==15746== LEAK SUMMARY:
==15746== definitely lost: 12 bytes in 3 blocks
==15746== indirectly lost: 42 bytes in 3 blocks
==15746== possibly lost: 0 bytes in 0 blocks
==15746== still reachable: 0 bytes in 0 blocks
==15746== suppressed: 0 bytes in 0 blocks
==15746== Rerun with --leak-check=full to see details of leaked memory
==15746==
==15746== For counts of detected and suppressed errors, rerun with: -v
==15746== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 15 from 8)
答案 0 :(得分:10)
我一再得到这个,并且无法弄清楚为什么'--leak-check = full'对我不起作用,所以我想我会提高tune2fs评论。
最可能的问题是你(不是ShrimpCrackers,但是现在正在阅读这篇文章的人)在命令行的末尾放置了--leak-check = full。 Valgrind希望您在输入实际命令行之前发布标志以运行程序。
即:
valgrind --leak-check=full ./myprogram
NOT:
valgrind ./myprogram --leak-check=full
答案 1 :(得分:4)
尝试valgrind --leak-check=full
这通常会打印出更多有用的信息。
在编译时也要添加-O0
标志,这样您的代码就不会得到优化。
答案 2 :(得分:4)
让我对其他读者更具体(我有同样的问题,但我的论点是正确的顺序): 我发现valgrind需要可执行文件的路径,如果你不给它,那么它将运行bu它不会给你行号。 在我的情况下,可执行文件位于我的PATH中的不同目录中,但要获取必须运行的行信息
valgrind --leak-check=full path_to_myprogram/myprogram
答案 3 :(得分:1)
这不是与valgrind相关的选项。相反,必须使用-g
选项编译代码,以保留调试符号。
cc -g main.c
valgrind --trace-children=yes --track-fds=yes --track-origins=yes --leak-check=full --show-leak-kinds=all ./a.out