2015-06-08 3 views
0

У меня есть программа, которая должна запускать valgind в другой программе и направлять вывод valgrind в другой файл. Код я использую:valgrind неправильное расположение вывода

char* args[] = {"sudo", //(This is inside a fork) 
     "valgrind", 
     "--leak-check=full", 
     "--show-leak-kinds=definite", 
     "--errors-for-leak-kinds=definite", 
     "<path to executable>", //placeholders 
     "&><path to output file>", //placeholders 
     "\0"}; 
execvp("sudo",args); 

Проблема я получаю в том, что независимо от того, что я делаю, это не на самом деле прямой выход в любом месте, но терминал.

Я пробовал «&>» и «>» без каких-либо изменений. Я попытался запустить его в терминале с перенаправленным выходом в файл, я также попытался запустить его в eclipse с терминальными аргументами и т. Д. Я не уверен, что еще я могу попробовать.

Кто-нибудь задумывается, почему «&>» не перенаправляет? Я подтвердил, что ввод массива args в терминале (а не как часть программы) действительно работает. Кажется, это просто что-то с программой C++ (возможно, fork?).

+0

перенаправление осуществляется оболочкой не 'execvp'. Также проверьте справочную страницу о том, как закончились аргументы. – Diego

ответ

1

Я рекомендую вам использовать --log-file=<filename> вариант.

Из инструкции:

--log-file=<filename>

Указывает, что Valgrind должен послать все свои сообщения в указанный файл. Если имя файла пуст, оно вызывает прерывание. Существует три специальных спецификатора формата, которые можно использовать в имени файла .

% p заменен на текущий идентификатор процесса. Это очень полезно для программы , вызывающей несколько процессов. ПРЕДУПРЕЖДЕНИЕ. Если вы используете --trace-children = yes, и ваша программа вызывает несколько процессов или ваши программные вилки без вызова exec после этого, и вы не используете этот спецификатор (или спецификатор% q ниже), вывод Valgrind из все эти процессы войдут в один файл, возможно, перепутались, и возможно неполные.

% q {FOO} заменяется содержимым переменной среды FOO. Если часть {FOO} неверна, это приводит к прерыванию. Этот спецификатор редко необходим, но очень полезен в определенных обстоятельствах (например, когда работает с программами MPI). Идея состоит в том, что вы указываете переменную, которая будет установлена ​​по-разному для каждого процесса в задании, например BPROC_RANK или что-то другое, что применимо в настройках MPI. Если указанная переменная среды не установлена, она вызывает прерывание. Обратите внимание, что в некоторых ракетах символы {и} могут быть экранированы с помощью обратного слэша .

%% заменено на%.

Если за% следует какой-либо другой символ, это приводит к прерыванию.

Если имя файл определяет относительное имя файла, оно помещается в начальном рабочем каталоге программы : это текущий каталог , когда программа начала свое выполнение после развилки или после Exec. Если он задает абсолютное имя файла (то есть начинается с '/'), тогда помещается туда.

+0

Спасибо, я не видел этот вариант, когда смотрел варианты справки. – Eric

Смежные вопросы