2011-10-17 71 views
2

你如何让Valgrind精确地显示出现错误的位置?我编译我的程序(通过PuTTy在Linux终端上的Windows机器上),添加-g调试选项。如何让Valgrind显示线路错误?

当我运行Valgrind时,我得到了泄漏和堆概要,而且我确实已经失去了内存,但我从来没有得到关于它发生的位置的信息(文件名,行)。在我分配内存之后,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

是的,它应该。你可以在这里粘贴valgrind输出吗?你在详细模式下运行valgrind吗? – Jack

+0

添加了输出。它说要重新运行--leak-check = full,但我确实用该标志运行它。不知道为什么它不起作用。即使使用-v模式,我也会得到相同的信息。 – ShrimpCrackers

+0

你是否说valgrind不支持泄漏检查选项? – Jack

回答

3

尝试valgrind --leak-check=full

这通常打印更多有用的信息。 编译时还要添加-O0标志,以免代码得到优化。

+0

试过了,没什么新意。也许Valgrind显示写入/读取错误...但不能显示内存泄漏发生的位置?只有存在内存泄漏?带有泄漏检查标志的 – ShrimpCrackers

+0

您将无法获得确切的行号。但是你会发现发生内存泄漏的函数的名字。例如:通过0x10000B311:LibpipeCreatorTestSuite :: testMemory()(在./test_libpipecreator) – tune2fs

+0

任何其他建议?标志参数不适用于我。 – ShrimpCrackers

9

我已经多次得到了大清洗这一点,并不能弄清楚为什么“--leak检查=全”是不是为我工作,所以我想我会碰到了tune2fs评论。

最有可能的问题是,你已经(不ShrimpCrackers,但不管是谁阅读这篇文章现在)放置--leak检查=全在您的命令行的末尾。 Valgrind希望您在输入实际命令行来运行程序之前发布该标志。

即:

valgrind --leak-check=full ./myprogram 

NOT:

valgrind ./myprogram --leak-check=full 
4

让我对其他读者(我有同样的问题,但我的论点是正确的顺序)更具体: 我发现valgrind需要通往可执行文件的路径,如果你不这样做,那么它会运行bu它不会给你行号。 在我的情况下,可执行文件在不同的目录,这是在我的路径,但让你有线路信息运行

valgrind --leak-check=full path_to_myprogram/myprogram