如何将Valgrind的输出重定向到文件?

167

在使用Valgrind工具时,我需要记录Valgrind工具生成的细节信息。我该如何实现?我尝试了以下方法:

 valgrind a.out | test

并且

 valgrind a.out > test

当程序不需要用户交互(即输入)时,它只提供程序的输出信息而没有valgrind内存错误和泄漏信息。如果程序需要用户输入,即使是那样也无法工作。

我该如何做?


3
你尝试过同时重定向标准输出和标准错误流吗? valgrind a.out &> file - sidyll
4个回答

457
valgrind --log-file="filename"

4
只保存标准错误输出是可以的,是否有可能将标准输出和标准错误输出保存到同一个文件中,并按照在终端中写入的顺序进行保存(即保持被测试程序的输出和Valgrind报告的错误之间的一致性)? - Prokop Hapala

92
默认情况下,Valgrind 将其输出写入 stderr。因此,您需要执行以下操作: ```html

默认情况下,Valgrind 将其输出写入 stderr。因此,您需要执行以下操作:

```
valgrind a.out > log.txt 2>&1

另外,您可以告诉Valgrind将输出写到其他位置; 参见http://valgrind.org/docs/manual/manual-core.html#manual-core.comment(但我从未尝试过这个功能)。


5
非常感谢:)。它起作用了。你能告诉我那个“2>&1”是什么意思吗? - Dinesh
11
我建议阅读 http://www.gnu.org/software/bash/manual/bashref.html#Redirections,其中介绍了Bash中奇怪的重定向语法! - Oliver Charlesworth
17
请注意,这个建议也会将a.out的输出发送到同一个日志文件。如果你想将valgrind的输出保存到日志文件中而包括a.out的输出,你应该使用Lex提供的--log-file选项。 - edam
这也是调试内存泄漏的好方法! - Free Url
如果您想将输出导向到另一个命令:valgrind ./struct -v --leak-check=full 2>&1 | nc -N paste.ubuntu.ir 1337 - EsmaeelE

12

如果您只想使用较少的日志记录方式查看日志,则还可以设置选项--log-fd。

例如:

valgrind --log-fd=1 ls | less

5
除了其他答案(特别是由 Lekakis 提供的答案)之外,一些字符串替换也可以在选项 --log-file= 中使用,这在 Valgrind 用户手册 中有详细说明。
撰写本文时提供了四种替换方法:
  • %p: 打印当前进程 ID
    • valgrind --log-file="myFile-%p.dat" <application-name>
  • %n: 打印当前进程唯一的文件序列号
    • valgrind --log-file="myFile-%p-%n.dat" <application-name>
  • %q{ENV}: 打印环境变量 ENV 的内容
    • valgrind --log-file="myFile-%q{HOME}.dat" <application-name>
  • %%: 打印字符 %
    • valgrind --log-file="myFile-%%.dat" <application-name>

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