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

Din*_*esh 137 redirect valgrind

在使用Valgrind工具时,我需要记录valgrind工具生成的详细信息.我怎么能做到这一点?我尝试过类似的东西,

 valgrind a.out | test
Run Code Online (Sandbox Code Playgroud)

 valgrind a.out > test
Run Code Online (Sandbox Code Playgroud)

它只给出了程序的输出而不是valgrind内存错误,泄漏信息.如果程序不需要用户交互(即提供输入),即使我是这样的.如果程序需要用户输入,即使该东西本身也不起作用.

我怎样才能做到这一点?

Vas*_*kis 403

valgrind --log-file="filename"
Run Code Online (Sandbox Code Playgroud)

  • 这仅保存了 stderr,是否可以按照在终端中写入的相同顺序将 stderr 和 stdout 保存到同一个文件中(即保持测试程序的输出与 valgrind 报告的错误之间的一致性)? (2认同)

Oli*_*rth 76

默认情况下,Valgrind将其输出写入stderr.所以你需要做类似的事情:

valgrind a.out > log.txt 2>&1
Run Code Online (Sandbox Code Playgroud)

或者,你可以告诉Valgrind在其他地方写作; 请参阅http://valgrind.org/docs/manual/manual-core.html#manual-core.comment(但我从未尝试过这个).

  • 注意:此建议也会将`a.out`的输出发送到同一个日志文件.如果你想将valgrind的输出保存到没有*`a.out`的日志文件*,你应该使用Lex建议的`--log-file`选项. (16认同)
  • @Dinesh:我建议阅读http://www.gnu.org/software/bash/manual/bashref.html#Redirections,它描述了进行重定向的奇怪的Bash语法! (9认同)
  • 非常感谢 :).有效.你能告诉我"2>&1"是什么吗? (3认同)

Zia*_*iad 9

如果您只想用较少的日志读取日志,也可以设置选项--log-fd.例如 :

valgrind --log-fd=1 ls | less
Run Code Online (Sandbox Code Playgroud)


Her*_*eer 5

除了其他答案(特别是Lekakis的答案)之外,还可以在选项中使用一些字符串替换,如Valgrind 用户手册--log-file=中所述。

在撰写本文时,有四种替代品可供选择:

  • %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>