Я использую valgrind, чтобы избавиться от ошибок в моей программе. Memcheck Вальгринда печатает в stderr. Я хочу изменить это:
valgrind --tool=memcheck ./a.out >output 2>grindout
Но я также хочу, чтобы вывод valgrind отображался на экране. Таким образом, вывод программы все идет в файл. Выход Valgrind помещается в grindout и отображается на экране. Как мне это сделать?
спасибо.
Используйте для этого тройник, но вам нужно сыграть несколько хитростей с stdout / stderr.
valgrind --tool=memcheck ./a.out 2>&1 > output | tee grindout
Объяснение: 2>&1
отправляет stderr на стандартный вывод, а обычный стандартный вывод отправляется в файл output
. Программа tee
передает стандартный ввод, но также сохраняет его в файл grindout
.
Вы ищете команду tee
. К сожалению, есть некоторые хитрости относительно перенаправления stderr и stdout. Должно работать следующее:
valgrind --tool=memcheck ./a.out 3>&1 2>&3 >output | tee grindout
Это перенаправляет стандартный вывод в output
, перемещает стандартную ошибку в новый файловый дескриптор 3
, который указывает на стандартный вывод. tee
берет этот stdout-ified stderr и печатает его как на экран, так и на gridnout
.
У меня была эта та же проблема. Проблема была вызвана путем буферизации. Можно читать больше о там здесь: http://mywiki.wooledge.org/BashFAQ/009
Это - решение, которое работало на меня:
stdbuf -o0 valgrind -v --tool=memcheck stdbuf -o0 ./a.out 2>&1 | stdbuf -o0 tee grindout
'stdbuf -o0'
помещенный перед каждой из трех программ, которые выполнены, заставляет их выключать буферизацию.
Проблема никогда не была, вывод не был сгенерирован, ни был проблемой, что это не шло в правильное место. Проблема состояла в том, что это не добиралось там в нужное время (из-за буферизации)