2016-02-22 1 views
2

Я написал программу, которая иногда протекает в дочерних процессах. Для того, чтобы попытаться выяснить, почему, я бегуКак я могу запустить valgrind с -leak-check = full в дочерних процессах?

valgrind --leak-check=full --trace-children=yes ./shell

The --leak-check=full правильно работает на родительском процессе, но это явно не применяется к дочерним процессам. Например,

==14044== Memcheck, a memory error detector 
==14044== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al. 
==14044== Using Valgrind-3.10.0 and LibVEX; rerun with -h for copyright info 
==14044== Command: ./shell 
==14044== 
Shell by: user 
(pid=14044)/home/user/user/shell$ invalid_command --flag-that-is-ignored 
Command executed by pid=14044 
invalid_command: not found 
==14046== 
==14046== HEAP SUMMARY: 
==14046==  in use at exit: 120 bytes in 1 blocks 
==14046== total heap usage: 16 allocs, 15 frees, 552 bytes allocated 
==14046== 
==14046== LEAK SUMMARY: 
==14046== definitely lost: 0 bytes in 0 blocks 
==14046== indirectly lost: 0 bytes in 0 blocks 
==14046==  possibly lost: 0 bytes in 0 blocks 
==14046== still reachable: 120 bytes in 1 blocks 
==14046==   suppressed: 0 bytes in 0 blocks 
==14046== Reachable blocks (those to which a pointer was found) are not shown. 
==14046== To see them, rerun with: --leak-check=full --show-leak-kinds=all 
==14046== 
==14046== For counts of detected and suppressed errors, rerun with: -v 
==14046== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 2 from 2) 
(pid=14044)/home/user/user/shell$ exit 
==14044== 
==14044== HEAP SUMMARY: 
==14044==  in use at exit: 0 bytes in 0 blocks 
==14044== total heap usage: 26 allocs, 26 frees, 845 bytes allocated 
==14044== 
==14044== All heap blocks were freed -- no leaks are possible 
==14044== 
==14044== For counts of detected and suppressed errors, rerun with: -v 
==14044== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 2 from 2) 

Как вы можете видеть, когда я звоню invalid_command из моей программы, он правильно видит, что invalid_command не команда и выводит сообщение об ошибке соответственно. Затем этот дочерний процесс очищается и завершается, а valgrind выводит сводку утечки. Но в отчете об утечке говорится rerun with: --leak-check=full, несмотря на то, что я сделал запустил его с этим флагом!

Когда я выхожу из родительского процесса, у меня нет утечек памяти, и кажется, что --leak-check=full правильно применяется к родительскому процессу.

Как я могу сделать --leak-check=full применительно к дочерним процессам, которые я создаю? Программа написана на C, и я просто использую обычную парадигму fork(); exec(); wait();.

+0

Можете ли вы не прочитать вывод 'valgrind --help'? Попробуйте '--help' практически с любой программой. Обычно это дает некоторую помощь (хотя некоторые требуют только «-h» для задания). Если это не удается, дайте фиктивный вариант (я обычно использую '-:') и вижу, что говорит сообщение об использовании. Это ответит на ваш вопрос. Вы хотите отслеживать детей совершенно разумно и разумно - но не используя возможности прямо перед вами (или проверка веб-сайта ['valgrind'] (http://valgrind.org/) и руководств там) - это вы. –

+0

@JonathanLeffler Извините, я забыл упомянуть, что я пытался использовать 'valgrind' с' --trace-children = yes' в дополнение к '--leak-check = full', но он по-прежнему не распространяется на детей , Всякий раз, когда я выхожу из ребенка, я получаю тот же результат, что и выше. –

+0

Это была довольно важная недостающая информация. Пожалуйста, обновите информацию в вопросе, показывающем командную строку и выводящий из запуска с действующей опцией. (С этой информацией ваш вопрос становится намного более разумным.) –

ответ

2

В следующей комбинации вариантов решить мою проблему:

valgrind --leak-check=full --show-leak-kinds=all --trace-children=yes ./shell

Если какой-либо из них опущены, на выходе будет, как показано выше (он не будет включать в себя номера строк).

+0

Рад, что у вас есть ответ, который вы искали. Иногда проблема не в том, что вы думаете, это в первую очередь? Похоже, что это было не то, что вы не следили за детьми, а скорее говорили, что не показываете утечки, которые дети производят. – gbtimmon

1

Я думаю, что вы ищете опцию --trace-children=yes.

+0

Я тоже так думал, но это дает мне тот же результат, что и выше. –