我有一个程序应该在另一个程序上运行valgind并将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);
我得到的问题是,无论我做什么,它实际上都不会将输出直接指向终端。
我试过“&amp;&gt;”和“&gt;”没有变化。我已经尝试在终端中运行它,并将输出重定向到文件,我也尝试在eclipse中使用终端参数运行它等等。我不确定我还能尝试什么。
有没有人知道为什么“&amp;&gt;”是不是重定向?我已经确认在终端中输入args数组(不是作为程序的一部分)确实有效。它似乎只是c ++程序(可能是fork?)。
答案 0 :(得分:1)
我建议您使用--log-file=<filename>
选项。
来自手册:
--log-file=<filename>
指定Valgrind应将其所有消息发送到指定文件。如果文件名为空,则会导致 中止。可以使用三种特殊格式说明符 在文件名中。
%p将替换为当前进程ID。这非常有用 调用多个进程的程序。警告:如果使用 --trace-children = yes,你的程序调用多个进程或你的程序分支,之后不调用exec,你不使用 这个说明符(或下面的%q说明符),Valgrind输出 所有这些进程将进入一个文件,可能混乱,并且 可能不完整。
%q {FOO}被环境变量FOO的内容替换。 如果{FOO}部分格式错误,则会导致中止。这个说明符是 很少需要,但在某些情况下非常有用(例如,何时 运行MPI程序)。这个想法是你指定一个变量 例如,将为作业中的每个进程设置不同的 BPROC_RANK或您的MPI设置中适用的任何内容。如果命名 环境变量未设置,导致中止。请注意,在一些 shell,{和}字符可能需要转义为 反斜杠。
%%替换为%。
如果%后跟任何其他字符,则会导致中止。
如果文件名指定了相对文件名,则将其放入 程序的初始工作目录:这是当前目录 当程序在fork之后或之后开始执行时 EXEC。如果它指定了绝对文件名(即以'/'开头),那么 它放在那里。