2010-05-18 5 views
10

Как работают средства обнаружения утечки памяти, такие как очистка и valgrind?Инструмент для обнаружения утечек памяти

Как я могу спроектировать и реализовать свой собственный такой инструмент?

+1

http://stackoverflow.com/questions/1656227/how-does-valgrind-work – stephan

+1

Вы можете попробовать мой [отладчик кучи] (http://stackoverflow.com/questions/2835416/critique-my-non- intrusive-heap-debugger) для начала ;-) – fredoverflow

+0

Я бы не отметил, что как дубликат, вопрос 'valgrind' имеет значение, но« как реализовать свое »является новым. –

ответ

5

Для основного обнаружения утечки вам просто нужно подключиться к низкоуровневым программам распределения памяти, например. путем исправления malloc/free. Затем вы отслеживаете все распределения и затем сообщаете о тех, которые не были освобождены в соответствующей точке, например. как раз перед выходом.

8

Такие инструменты обычно инструмент exeutable с их собственным кодом. например, они заменяют каждый звонок на malloc() и free() с их собственными функциями, что позволяет им следить за каждым распределением.

В Visual Studio это может быть сделано автоматически, используя только C Runtime библиотеки, используя функцию из семейства _CrtDumpMemoryLeaks()

+2

Вы можете использовать инструменты - deleaker (если вы пользователь Windows). – MastAvalons

+2

deleaker - крутой инструмент! Память Supoort и утечки GDI, e.t. – z0r1fan

3

Для реальной работы, Valgrind работает достаточно хорошо. Он обнаруживает недопустимые чтения/записи и утечки памяти.

Для проекта hobby вы можете создать свой собственный модуль управления памятью, который отслеживает распределение различных указателей и его использование. Если вы не видите какое-либо место mem, которое используется в течение длительного времени, это может быть утечка.

1

Я занимаюсь разработкой этого инструмента: Deleaker.

Конечно, очевидная идея состоит в том, чтобы перехватывать все функции, которые выполняют распределения и освобождения. Это не только malloc и free, скорее HeapAlloc/HeapFree (если мы говорим о платформе Windows), потому что современные версии VC++ (после VC 6.0) просто перенаправляют malloc/free на Winapi HeapAlloc/HeapFree.

Для каждого распределения стек сохраняется и сохраняется объект. При каждом освобождении объект освобождается. На первый взгляд это так просто: просто сохраните список выделенных объектов и удалите объект на крюке перерасхода.

Но есть Хитрость:

  • Скорость

Вы должны поддерживать список выделенных объектов. Если вы добавляете/удаляете объект в каждой подключенной функции, процесс выполняется в режиме suooo slooow. Это, по-видимому, общая проблема таких инструментов.

  • Трассировка стека

Использование dbghelp.dll функции для получения трассировки стека занимает много времени. Вы должны быстрее получать записи стека: например, путем ручного чтения памяти процесса.

  • Ложноположительных

Некоторых утечки производятся системными библиотеками. Если вы покажете им все, у вас есть тонны утечек, но пользователь не может «решить» его: у него нет доступа к его исходному коду и он не может предотвратить выполнение этого кода.Это невозможно остановить. Некоторые из них представляют собой единичные распределения в точке входа в систему dll, поэтому это не настоящая утечка (хороший вопрос, а какая утечка вообще?). Как распознать те утечки, которые должны быть показаны? Хорошая фильтрация - это ответ.

Надеюсь, это поможет.

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