valgrind输出位置不正确

时间:2015-06-08 18:39:59

标签: c++ ubuntu valgrind

我有一个程序应该在另一个程序上运行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?)。

1 个答案:

答案 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。如果它指定了绝对文件名(即以'/'开头),那么   它放在那里。