我正在运行 valgrind 来找出程序中的错误。Valgrind 的 memcheck 会打印到 stderr。我想要做的是修改一下这个:
valgrind --tool=memcheck ./a.out >output 2>grindout
但是,我还希望 valgrind 输出显示在屏幕上。因此程序的输出全部进入文件。Valgrind 输出放置在 grindout 中并显示在屏幕上。我该怎么做?
谢谢。
答案1
您正在寻找tee
命令。不幸的是,重定向 stderr 和 stdout 时存在一些技巧。以下应该有效:
valgrind --tool=memcheck ./a.out 3>&1 2>&3 >output | tee grindout
这会将标准输出重定向到,将标准错误移动到指向 stdout 的output
新文件描述符。获取这个 stdout-ified stderr 并将其打印到屏幕和。3
tee
gridnout
答案2
为此使用 tee,但您需要对 stdout / stderr 进行一些技巧。
valgrind --tool=memcheck ./a.out 2>&1 > output | tee grindout
解释:2>&1
将 stderr 发送到 stdout,常规 stdout 发送到文件output
。tee
程序传递 stdin,但也将其保存到文件grindout
。
答案3
我也遇到了同样的问题。该问题是由缓冲引起的。您可以在此处阅读更多相关信息:http://mywiki.wooledge.org/BashFAQ/009
这是对我有用的解决方案:
stdbuf -o0 valgrind -v --tool=memcheck stdbuf -o0 ./a.out 2>&1 | stdbuf -o0 tee grindout
放置'stdbuf -o0'
在三个被执行的程序前面的会导致它们关闭缓冲。
问题从来不是输出没有生成,也不是输出没有到达正确的地方。问题在于它没有在正确的时间到达那里(由于缓冲)