你怎么得到Valgrind显示行错误?

时间:2011-10-17 18:22:30

标签: valgrind

如何让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)

4 个答案:

答案 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