2017-01-26 1 views
1

포크를 사용하여 다른 프로세스를 만들고 거의 즉시 execv를 실행 파일에 호출하는 프로그램이 있습니다. 자식 프로세스에서 메모리 누수가 있는지 확인하려고합니다. 주 프로세스가 많은 다른 실행 파일을 시작하고 더 많은 스크립트 (--trace-children 옵션을 사용하기에는 추적하기가 너무 어렵습니다)를 실행하기 때문에 execv를 사용하여 주 프로세스 내부에서 valgrind를 호출하고 인수로 실행할 수 있습니다.valgrind를 실행하는 동안 오류가 발생했습니다.

내 코드는 이런 식입니다 -

memleak 내가 누출을 검사 할 프로그램입니다
#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; 
} 

. 하지만이 프로그램을 실행하면이 오류가 발생합니다.

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. 

나는 봤지만 이유를 찾을 수 없었다. 도와주세요!

+2

당신이'arguments' 배열을 설정하는 방법에 대해 자세히 살펴 보자. 그런 다음 배열이 null 포인터로 끝나야한다는 것을 기억해야합니다. –

+0

[execve 및 설정 환경 변수에 대한 이해 요구 사항]의 가능한 중복 (http://stackoverflow.com/questions/7656549/understanding-requirements-for-execve-and-setting-environment-vars) – jww

답변

1

실행 경로를 전달하지 않습니다.

arguments[0] = exepath; 
arguments[1] = tool; 
arguments[2] = logpath; 
arguments[3] = executable; 

가 알려줘 당신이 어떤 문제에 직면하는 경우
arguments[0] = exepath; 
arguments[1] = tool; 
arguments[2] = logpath; 
arguments[3] = exepath; 

는 교체 ..

+1

'arguments [4] = NULL'도 마찬가지입니다. – jww

+0

@Thiru Shetty 나는 간과했다! 고맙습니다! – aniztar

+0

@jww 감사합니다. 이 코드를 작성하는 동안 나는 눈이 멀었 음에 틀림 없다. :) – aniztar

관련 문제