обнаружение утечки памяти в C - PullRequest
1 голос
/ 19 ноября 2010

Я знаю, что это вряд ли новый вопрос, но я не нашел ничего другого, что работает. У меня есть программа на C, которая постоянно потребляет память во время работы - я использую команду «free» для ее отслеживания и вижу, что объем доступной памяти уменьшается по мере ее выполнения, чего не должно происходить. Тем не менее, я не могу найти ничего в самой программе, которая может быть причиной этого. Я также проверил это с помощью valgrind и dmalloc, и ни один из них не может обнаружить любую потерю памяти.

Как мне найти утечку?

Ответы [ 2 ]

3 голосов
/ 19 ноября 2010

Действительно ли утечка памяти или программа просто потребляет больше памяти, чем дольше она работает? Другими словами, возможно, программа создает большую динамическую структуру данных (связанный список и т. Д.), Которая просто продолжает расти? Пока программа имеет указатель на память, это на самом деле не утечка, но если выделения никогда не освобождаются, каждый новый получит больше памяти от ОС. Это также объясняет, почему используемые вами инструменты не сообщали об «утечках».

Когда мне приходилось делать это, я делал такие вещи, как запись журнала в плоский файл каждый раз, когда моя программа выделяла память и освобождала ее. Сообщения будут включать такие вещи, как имя файла и строка программы, где была выделена память, и адрес, возвращаемый из malloc при выделении памяти, или аналогично имя файла и строка программы, где была освобождена память, и адрес освобождаемого буфера. Затем вы можете отсортировать полученный файл по адресу, и эти адреса с сообщением «ALLOCATE», но без сообщения «FREE», являются теми, которые могли просочиться или, по крайней мере, не были освобождены к моменту завершения программы. Это может занять много времени для внедрения, и автоматизированные инструменты лучше, если они у вас есть, но в зависимости от ваших обстоятельств вам, возможно, придется сделать что-то подобное.

Или, возможно, вы захотите просто надуть и использовать сборщик мусора. Коллектор Boehm может работать на вас - взгляните на http://www.hpl.hp.com/personal/Hans_Boehm/gc/.

Делись и наслаждайся.

3 голосов
/ 19 ноября 2010

Если вы уверены в вашем использовании памяти, возможно, проблема не в ваших mallocs и освобождает.

Если вы используете какой-либоlibs, вы должны перепроверить, что вы используете их правильно.Многие из них имеют функции инициализации и освобождения, которые вы легко можете забыть, что приводит к утечке памяти.

...