我有一个程序,它使用fork创建另一个进程,几乎立即调用execv执行可执行文件。我想检查子进程的内存泄漏。由于主进程启动了许多其他可执行文件并运行了更多脚本(使用--trace-children选项很难跟踪),我想使用execv从主进程内部调用valgrind并传递可执行文件作为参数。
我的代码是这样的 -
#include <stdio.h>
#include <string.h>
#include <unistd.h>
int main()
{
char tool[30], logpath[30], executable[30], exepath[30];
char *arguments[5];
strcpy(tool, "--leak-check=full");
strcpy(logpath, "--log-file=valrep.txt");
strcpy(executable, "./memleak");
strcpy(exepath, "/usr/bin/valgrind");
arguments[0] = exepath;
arguments[1] = tool;
arguments[2] = logpath;
arguments[3] = exepath;
execv("/usr/bin/valgrind", arguments);
return 0;
}
memleak是我要检查泄漏的程序。但是当我运行这个程序时,我收到了这个错误。
Running valgrind using the tool: --leak-check=full.
The report is stored in: --log-file=valrep.txt.
valgrind: You cannot run '/usr/bin/valgrind' directly.
valgrind: You should use $prefix/bin/valgrind.
我做了一些谷歌搜索,但无法找出原因。请帮忙!
答案 0 :(得分:1)
您没有传递可执行路径。
arguments[0] = exepath;
arguments[1] = tool;
arguments[2] = logpath;
arguments[3] = exepath;
替换为
arguments[0] = exepath;
arguments[1] = tool;
arguments[2] = logpath;
arguments[3] = executable;
如果您对此有任何疑问,请告诉我。