Я написал программу, которая иногда протекает в дочерних процессах. Для того, чтобы попытаться выяснить, почему, я бегуКак я могу запустить 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();
.
Можете ли вы не прочитать вывод 'valgrind --help'? Попробуйте '--help' практически с любой программой. Обычно это дает некоторую помощь (хотя некоторые требуют только «-h» для задания). Если это не удается, дайте фиктивный вариант (я обычно использую '-:') и вижу, что говорит сообщение об использовании. Это ответит на ваш вопрос. Вы хотите отслеживать детей совершенно разумно и разумно - но не используя возможности прямо перед вами (или проверка веб-сайта ['valgrind'] (http://valgrind.org/) и руководств там) - это вы. –
@JonathanLeffler Извините, я забыл упомянуть, что я пытался использовать 'valgrind' с' --trace-children = yes' в дополнение к '--leak-check = full', но он по-прежнему не распространяется на детей , Всякий раз, когда я выхожу из ребенка, я получаю тот же результат, что и выше. –
Это была довольно важная недостающая информация. Пожалуйста, обновите информацию в вопросе, показывающем командную строку и выводящий из запуска с действующей опцией. (С этой информацией ваш вопрос становится намного более разумным.) –