2014-10-01 4 views
3

В некоторых программах часть выделенной памяти вообще не уничтожается, но они требуются для всего времени работы программы. Следовательно, в целом считается безопасным.Как проверить фактические утечки памяти во время выполнения с помощью Valgrind?

Но есть и другие объекты, которые не предназначены для всего времени работы программы, но не уничтожены из-за промахов разработчиков. Это фактические утечки памяти, которые необходимо устранить.

Когда мы запускаем следующую команду Valgrind, она отображает только полные утечки после завершения выполнения программы. Следовательно, может кто-то прояснить, как отличить выше двух сценариев от выхода проверки утечки Valgrind.

Команда, которую я использовал для обнаружения утечек памяти;

valgrind --log-file=valgrind_output.txt --tool=memcheck --leak-check=yes ./MyTestProgram 

Типичный выход в конце исполнения;

==10108== LEAK SUMMARY: 
==10108== definitely lost: 392,323 bytes in 1,164 blocks 
==10108== indirectly lost: 178,120 bytes in 4,283 blocks 
==10108==  possibly lost: 170,155,118 bytes in 3,347,087 blocks 
==10108== still reachable: 263,778,326 bytes in 3,935,669 blocks 

Есть ли возможность в Valgrind, как Tap в IBM Purify инструмент, который может обнаружить в настоящее время утечка памяти во время выполнения?

+0

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

+0

выглядит как копия этого: http://stackoverflow.com/q/7945885/476681 –

+0

Позднее наблюдение за вышеприведенным комментарием ... рассмотрим объект с нетривиальным деструктором, который делает больше, чем просто освобождение памяти. Закрытие сокетов, отправка в базу данных, что-то в этом роде. Если вы просто оставите такой объект болтающимся (например, назначив его через 'new', а затем никогда не называя' delete' на нем), * этот деструктор никогда не будет называться *, даже хотя ОС будет очищать пространство памяти после завершения процесса. Вот почему те, кто страдает от утери, должны быть восприняты всерьез. – DevSolar

ответ

2

Есть ли функция в Valgrind как Tap в инструменте IBM Purify, который может обнаруживать текущую утечку памяти во время выполнения?

Нет, не существует. Valgrind не может знать, есть ли утечка, если программа не закончилась, потому что она не может знать, что будет выпущено, когда программа закончится.

+0

Не может быть правдой, но ваше техническое возражение немного пустое - это может, по крайней мере, дать обоснованное предположение, используя эвристику стиля коллекции мусора. –

+0

@TonyD Лично я предпочитаю твердые факты о том, что моя программа утечки памяти, а не догадывается. И нет никаких способов сказать со 100% уверенностью, что некоторая память не будет выпущена. –

+2

Это просто свинья. Если вы начинаете устранять проблему с памятью, вы обычно не начинаете с «твердых фактов» о причине, вы начинаете с спекулятивных и вероятностных индикаторов, которые ведут ваше исследование. В любом случае ... что угодно ... извините за то, что вы предложили подумать о том, что возможно .... –

3

Вы можете использовать 2 разных метода для поиска утечки во время выполнения.

  1. Из команды оболочки, запустите vgdb leak_check Есть другие необязательные аргументы leak_check мониторных команд, например, в найти достижимую память, или просто память, что увеличение или .... См Valgrind инструкции для деталей: http://www.valgrind.org/docs/manual/mc-manual.html#mc-manual.monitor-commands

  2. Внутри вашей программы: Вы можете добавить в ваши запросы клиентов программы, чтобы сделать поиск утечки. . вставить «звонки» в VALGRIND_DO_LEAK_CHECK или VALGRIND_DO_ADDED_LEAK_CHECK См http://www.valgrind.org/docs/manual/mc-manual.html#mc-manual.clientreqs для более подробной информации

+0

Спасибо, что указали это! –

0

Вы можете сделать свою программу намеренно врезаться во время работы, чтобы убедиться, что вы можете проверить выделенную память в этой точке. Вы можете сделать это, добавив обработчик сигнала для определенного пользовательского сигнала, такого как SIGUSR1.

signal(SIGUSR1, myhandler); 

в обработчике, то вы делаете что-то вроде этого:

printf("debug exit!\n"); 
int *ptr = 0; 
*ptr = 0xdeadbeef; 

Вы можете отправить этот сигнал к вашему приложению, как это:

kill -s SIGUSR1 `ps -aux| grep myapp | head -n -1 | awk '{print $2}'` 

Затем вы можете проверять различия в цифрах выделенных объектов.Если вы знаете, что числа должны оставаться одинаковыми или если некоторое число продолжает расти, вы можете проверить место, где это происходит, и посмотреть, есть ли там утечка памяти.