2017-01-26 4 views
1

У меня есть программа, которая создает другой процесс с использованием вилки и почти сразу вызывает execv в исполняемом файле. Я хочу проверить утечку памяти на дочерний процесс. Поскольку основной процесс запускает множество других исполняемых файлов и запускает еще много скриптов (которые слишком сложно отслеживать для использования опции -trace-children), я хочу вызвать valgrind изнутри основного процесса с помощью 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. 

Я сделал некоторые поисковые запросы, но не смог узнать причину. Пожалуйста помоги!

+2

Присмотритесь на то, как вы создали 'arguments' массив. Тогда вам нужно помнить, что массив должен быть завершен нулевым указателем. –

+0

Возможный дубликат [понимания требований для execve и настроек среды vars] (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] = exepath; 

Заменять

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

Позвольте мне знать, если вы сталкиваетесь с какой-либо проблемы с этим ..

+1

'arguments [4] = NULL' тоже. – jww

+0

@Thiru Shetty Я забыл! Спасибо! – aniztar

+0

@jww Спасибо, что тоже нужно! Я должен был быть слепым при написании этого кода :) – aniztar

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