Поиск утечек памяти

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Поиск утечек памяти

Сообщение Climber » 14.07.2010 14:49:53

Как его правильно делать?
Я пока делаю так. У меня есть такой простенький модуль:
Код: Выделить всё
unit checkMem;

interface
function getlost: longint;

implementation

uses sysUtils, dialogs;
var HPs : THeapStatus;
var HPe : THeapStatus;
var lost: integer;

function getlost: longint;
begin
  HPe := getHeapStatus;
  Result:=HPe.TotalAllocated-HPs.TotalAllocated;
end;

initialization

  HPs := getHeapStatus;

finalization

  HPe := getHeapStatus;
  Lost:= HPe.TotalAllocated - HPs.TotalAllocated;
  if lost >  0 then begin
     beep;
     ShowMessage( format('lostMem: %d',[ lost ]) );
  end;

end.
Где взял - не помню, давно дело было. Функция getlost из этого модуля показывает, как я понимаю, сколько памяти занято в данный момент.
Поиск утечек в своем классе я делаю с помощью юниттеста:
Код: Выделить всё
procedure TContactDialogTestCase.MemoryLeaks;
var c: TContactController;
    l: longint;
begin
  l:=getlost;
  c:=TContactController.Create(TContactDialog, cnEdit, TF.ZC, 123, 2574, -1, TEST_CLIENT_NAME);
  c.Free;
  AssertEquals('Утечка памяти', 0, getlost - l);
end;
Функция AssertEquals вызывает исключение, если есть разница между параметрами 2 и 3 (0 и getlost - l). У меня получается вот что: если выполнить тест 1 раз, то куда-то теряется 144 байта, а если выполнить второй раз - то ничего не теряется. Если очистить конструктор класса TContactController от создания объектов (они удаляются в деструкторе), то потерь никаких нет.

То есть тут что-то не так с определением размера занятой в данный момент памяти?
Climber
постоялец
 
Сообщения: 415
Зарегистрирован: 03.06.2007 20:09:57
Откуда: Москва

Re: Поиск утечек памяти

Сообщение скалогрыз » 14.07.2010 14:59:58

может checkMem подключился не самым первым в проекте?

и в чём проблема с использованием heaptrc?
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Поиск утечек памяти

Сообщение Climber » 14.07.2010 17:25:00

А как влияет порядок подключения модулей? Как я понимаю, в данном случае я узнаю размер занятой памяти где-то в середине программы, а потом узнаю его еще раз через два действия. Программа на этом не завершается.

А с heaptrc случилась какая-то фигня и он перестал работать где-то полгода назад. Выскакивает вот такое окно:

Добавлено спустя 8 минут 39 секунд:
Хм, запустил программу из-под Far - увидел сообщение "Runtime Error 5 at $0041274C" (это если компилировать с галочкой "использовать модуль heaptrc").
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Climber
постоялец
 
Сообщения: 415
Зарегистрирован: 03.06.2007 20:09:57
Откуда: Москва

Re: Поиск утечек памяти

Сообщение скалогрыз » 14.07.2010 19:42:32

Climber писал(а):Добавлено спустя 8 минут 39 секунд:
Хм, запустил программу из-под Far - увидел сообщение "Runtime Error 5 at $0041274C" (это если компилировать с галочкой "использовать модуль heaptrc").

может стоит убрать галочку "Win32 GUI application"?
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Поиск утечек памяти

Сообщение Climber » 15.07.2010 08:24:12

А где такая галочка? Что-то найти не могу...
Climber
постоялец
 
Сообщения: 415
Зарегистрирован: 03.06.2007 20:09:57
Откуда: Москва

Re: Поиск утечек памяти

Сообщение GrayEddy » 15.07.2010 08:36:52

Меню Проект -> Парамметры проекта -> (дерево) Параметры компилятора -> Компоновка (для Lazarus 0.29)
GrayEddy
постоялец
 
Сообщения: 375
Зарегистрирован: 06.05.2005 09:37:56

Re: Поиск утечек памяти

Сообщение Climber » 15.07.2010 10:34:52

Вроде заработало, только я окончательно запутался.
Эта галочка у меня изначально не стояла. Я ее сначала поставил, потом снял - после этого заработало. Но это ерунда.
В файле появилась куча информации по одному моему компоненту (с ним я отдельно разберусь), но не появилось никакой информации по коду, который фигурировал в первом посте. Тут проблема в том, что тот код (код конструктора и деструктора, который я сюда не выкладывал) довольно простой, и найти там ошибку можно и просто читая его. Я его уже много раз просматривал и уверен, что утечек быть не должно. heaptrc их и не находит. А checkMem находит почему-то, хотя я аналогичным образом использовал checkMem ранее и все было нормально...
В крайнем случае, сделаю вид, что раз heaptrc ничего не находит, значит, ничего и нет :wink:
Climber
постоялец
 
Сообщения: 415
Зарегистрирован: 03.06.2007 20:09:57
Откуда: Москва

Re: Поиск утечек памяти

Сообщение скалогрыз » 15.07.2010 11:35:56

Climber писал(а):Тут проблема в том, что тот код (код конструктора и деструктора, который я сюда не выкладывал) довольно простой, и найти там ошибку можно и просто читая его. Я его уже много раз просматривал и уверен, что утечек быть не должно. heaptrc их и не находит. А checkMem находит почему-то, хотя я аналогичным образом использовал checkMem ранее и все было нормально...
В крайнем случае, сделаю вид, что раз heaptrc ничего не находит, значит, ничего и нет :wink:


Проблема тут в другом:
- ты нашёл какой-то там проверяльщик. Как ты писал сам: "Где взял - не помню, давно дело было."
- не убедился в том, что он работает и начал его использовать.
- теперь ты даже не знаешь в чём глюки: в твоём коде, heaptrc или checkMem :D

Сделай так:

1. Создаёшь пустое приложение. Кладёшь на него кнопку. В кнопке пишешь код:
Код: Выделить всё
procedure Form1.Button1Click(Sender: TObject);
var
  p : Pointer;
begin
  GetMem(p, 1024*4);
end;


2. Компилируешь приложение c heapTrc (отключив, галочку Win32 GUI). Запускаешь приложение, нажимаешь кнопочку, закрываешь приложение - смотришь результаты.

3. Убираешь использование heapTrc. В основном файле проекта подключаешь checkMem. Компилируешь, запускаешь, нажимаешь кнопочку, закрываешь приложение - смотришь результаты.

4. Сравниваешь результаты 3 и 4, делаешь выводы о том, что как и где (не) работает.

5. Прикручиваешь проверки памяти к своему компоненту.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Поиск утечек памяти

Сообщение Climber » 15.07.2010 15:38:53

скалогрыз писал(а):Проблема тут в другом:
- ты нашёл какой-то там проверяльщик. Как ты писал сам: "Где взял - не помню, давно дело было."
- не убедился в том, что он работает и начал его использовать.
- теперь ты даже не знаешь в чём глюки: в твоём коде, heaptrc или checkMem :D
Не совсем верно. Нашел или в DRKB (но эту подборку многие ругают), или на одном из Delphi-форумов. В том, что он работает - убеждался. С точностью до байта. Но теперь что-то пошло не так.
Код этого модуля тут приведен полностью - он, собственно, просто запрашивает размер выделенной памяти или что-то типа того. Теперь осталось понять: или в работе этого модуля есть какие-то тонкости, и верить надо heaptrc (к чему я и склоняюсь), или врет heaptrc (что я вряд ли докажу). Вопрос, как мне кажется, должен свестись к следующему: что за класс такой - THeapStatus?

скалогрыз писал(а):Сделай так:
...
Я именно так и делаю обычно, просто пока руки не дошли.
Climber
постоялец
 
Сообщения: 415
Зарегистрирован: 03.06.2007 20:09:57
Откуда: Москва


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 17

Рейтинг@Mail.ru