如何让Valgrind显示行错误?

10

如何使Valgrind准确显示错误发生的位置? 我使用-g调试选项编译了我的程序(通过PuTTy在Linux终端上的Windows机器上进行)。

运行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)

是的,应该的。你能在这里粘贴valgrind输出吗?你正在以详细模式运行valgrind吗? - Jack
添加了输出。它建议重新运行时加上 --leak-check=full,但我运行时已经带上了这个标志。不知道为什么它不起作用。即使是在 -v 模式下,我始终得到相同的信息。 - ShrimpCrackers
你是说valgrind不支持leak-check选项吗? - Jack
请参考此页面:https://dev59.com/IGox5IYBdhLWcg3wQSOp,其中提供了需要设置的标志信息。 - thar_bun
5个回答

15

我一再受到影响,无法弄清楚为什么"--leak-check=full"对我不起作用,所以我想提高tune2fs的评论。

最可能的问题是你(不是ShrimpCrackers,而是正在阅读此帖子的人)将"--leak-check=full"放在命令行的末尾。Valgrind希望您在输入实际的命令行运行程序之前发布标志。

即:

valgrind --leak-check=full ./myprogram

不要:

valgrind ./myprogram --leak-check=full

8

这与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

1
我不知道为什么这个答案没有被接受 - undefined

8

尝试使用valgrind --leak-check=full

这通常会打印更有用的信息。 在编译代码时添加-O0标志,以便您的代码不会被优化。


尝试过了,没有什么新的发现。也许Valgrind会显示写入/读取错误...但无法显示内存泄漏发生的位置?只能表明存在内存泄漏? - ShrimpCrackers
使用泄漏检查标志,您将无法获得精确的行号。但是,您将找到发生内存泄漏的函数名称。例如:通过0x10000B311:LibpipeCreatorTestSuite :: testMemory()(在./test_libpipecreator中) - tune2fs
还有其他建议吗?对我来说,标志参数不起作用。 - ShrimpCrackers
2
你能给我们提供以下命令的输出吗:valgrind --leak-check=full ./yourprogram - tune2fs
tune2fs,谢谢!我正在执行valgrind ./myprogram --leak-check=full,这可能是为什么它没有工作的原因。 - ShrimpCrackers

6

让我对其他读者更具体地说明(我遇到了同样的问题,但我的参数是正确的):我发现valgrind需要可执行文件的路径,如果你不给它,那么它会运行,但不会给你行号。在我的情况下,可执行文件位于另一个目录中,该目录在我的PATH中,但要获取行信息,您必须运行

valgrind --leak-check=full path_to_myprogram/myprogram

0
为了让valgrind在文件中显示错误发生的行数,我必须在编译命令的末尾添加-g。
例如:
gcc -o main main.c -g

然后只需运行valgrind:

valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes ./main

gcc -g -o main main.c - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接