(РЕШЕНО) Heaptrc показывает утечку памяти...

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

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

(РЕШЕНО) Heaptrc показывает утечку памяти...

Сообщение java73 » 03.12.2019 10:45:40

Всем привет.
Может ли модуль Heaptrc ошибаться в такой ситуации?
В приложении последовательно создаются множество объектов. Сначала создается крупный объект - менеджер, в нем все остальные объекты при создании добавляются в свой список объектов. Менеджер владеет всеми списками объектов.
1) Один объект А из какого-либо списка может содержать ассоциации на другие объекты Б из других списков. Поэтому, когда первый объект А удаляется, в его деструкторе не вызывается метод Free объекта Б, а полю, ассоциированному с этим объектом, присваивается nil.
2) Также объект А может содержать список, в который ассоциированы множество объектов Б. Поскольку объекты Б входят уже в список менеджера, список объекта А создается со свойством ownobjects:=false. Т.е. при удалении списка из объекта А не происходит удаление входящих в него объектов. Вместо этого в деструкторе объекта А список объектов Б очищается (метод clear) и удаляется (free).
При завершении в деструкторе менеджера все списки удаляются, соответственно все входящие в них объекты также освобождают память.
================
Модуль Heaptrc НЕ показывает утечек в ситуации 1, т.е. когда есть ассоциации отдельных объектов.
Однако в ситуации 2 он начинает орать, что есть неосвобожденные куски памяти. Я уже на листе нарисовал всю последовательность создания всех объектов, всех списков и удаления их. Не вижу пробелов... Может ли быть это ошибкой? Или все-таки я мог что-то забыть.
В примере, в котором Heaptrc уже начинает орать, объект А создает список объектов Б, в который добавляется всего один объект Б (также он добавляется в список менеджера). При завершении объект А удаляется (список объектов Б внутри него очищается и удаляется), затем менеджер удаляет все списки, включая объекты А и Б. Не должно быть не удаленных объектов, но Heaptrc все равно орёт.

P.S. Я постарался максимально объяснить, но если б клал куски кода, то, наоборот, бы запутал только. Там оооочень много.
Последний раз редактировалось java73 03.12.2019 14:50:56, всего редактировалось 1 раз.
java73
постоялец
 
Сообщения: 257
Зарегистрирован: 21.11.2013 09:08:10

Re: Heaptrc показывает утечку памяти, хотя её не должно быть

Сообщение iskander » 03.12.2019 11:06:31

java73 писал(а):Может ли модуль Heaptrc ошибаться

Ни разу пока не сталкивался с такой ситуацией. Желателен все же минимальный пример утечки.
iskander
энтузиаст
 
Сообщения: 590
Зарегистрирован: 08.01.2012 18:43:34

Re: Heaptrc показывает утечку памяти, хотя её не должно быть

Сообщение olegy123 » 03.12.2019 11:12:30

На сколько я понимаю логику Heaptrc - если в куче есть активные ссылочные части он их показывает.
Вообще он мне здорово помог при написании систем 24/7/365
Сигналил на объекты при удалении Object.Free, при них росла утечка памяти. Когда перешел на FreeAndNil(Object) - все стало ок.
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: Heaptrc показывает утечку памяти, хотя её не должно быть

Сообщение java73 » 03.12.2019 14:49:38

Блин))) ошибка как всегда скрывалась в невнимательности. Всё проще: heaptrc молодец, а я вот нет.
Код: Выделить всё
lNice := TNiceClass.Create;
      lNice := TIntel20Context(pContext).ReadNiceClass(Query.FieldByName('ID').AsInteger);
      goodslist.Add(lNice);

В этом коде прекрасно всё...за исключением TNiceClass.Create. Поскольку в следующем методе ReadNiceClass объект также создается.
Задвоение объектов выловил с помощью LazLogger, поставив лог в Сreate/Destroy:
Код: Выделить всё
+ create TNiceClass with ID=0
+ create TNiceClass with ID=2
+++ create a new object TTrademark with ID=1
       Internal list of TtiObjectList free (0 objects)
- destroy TtiObjectList with ID=0
....
- destroy TNiceClass with ID=2
       Internal list of TtiObjectList free (1 objects)

В список попадал второй объект, а первый оставался болтаться в памяти неприкаянный.

Добавлено спустя 2 часа 49 минут 30 секунд:
Re: (РЕШЕНО) Heaptrc показывает утечку памяти...
А ведь два дня потратил.
Написал десяток тестов. Раскидал везде записей в логи. Два листа А4 вручную исписал процессами создания/удаления всех объектов. Обидно, что ошибка была нелепой и никак вообще не связанной с тем местом, где я искал первопричину.
java73
постоялец
 
Сообщения: 257
Зарегистрирован: 21.11.2013 09:08:10

Re: (РЕШЕНО) Heaptrc показывает утечку памяти...

Сообщение zoltanleo » 05.12.2019 18:28:59

java73 писал(а):Обидно, что ошибка была нелепой и никак вообще не связанной с тем местом, где я искал первопричину.

было бы обидно, если не нашел :)
Аватара пользователя
zoltanleo
постоялец
 
Сообщения: 457
Зарегистрирован: 17.10.2013 10:55:01

Re: (РЕШЕНО) Heaptrc показывает утечку памяти...

Сообщение Sharfik » 28.11.2022 00:42:27

А как откапывать проблему если в логе только адреса памяти во время работы?

Код: Выделить всё
168959 memory blocks allocated : 67278147/67831712
168958 memory blocks freed     : 67278055/67831616
1 unfreed memory blocks : 92
True heap size : 950272 (128 used in System startup)
True free heap : 949936
Should be : 949952
Call trace for block $01E89B58 size 92
  $0046D90A
  $004034FB
  $00508EDC
  $0050CAC7
  $00518BCC
  $0051AB51
  $0051AA88
  $00433B4C
  $00433A19
  $005098EE
  $0050D22F
  $0050CE2A
  $0050D441
  $0050D2D0
  $0051958E
  $0051ADBC
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 760
Зарегистрирован: 20.07.2013 01:04:30

Re: (РЕШЕНО) Heaptrc показывает утечку памяти...

Сообщение zub » 28.11.2022 01:17:42

собрать проект с включенной отладочной информацией и информацией о номерах строк -gw2 -gl
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

Re: (РЕШЕНО) Heaptrc показывает утечку памяти...

Сообщение Sharfik » 28.11.2022 01:31:31

zub писал(а):собрать проект с включенной отладочной информацией и информацией о номерах строк -gw2 -gl

Спасибо, но не то. Отладочная информация всегда включена в автоматическом режиме. Попробовал ради интереса -gw2 не отображаются строки все равно. Пока делал вспомнил об одной проблеме Lazarus. Давно не прогонял через поиск утечек и забыл о ней. Проблема в русских буквах в путях. :( Путь компиляции вида "../../../Assi System/bin-бин/jbimassist" непригоден, а вот с "../../../Assi System/bin/jbimassist" все работает на ура.
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 760
Зарегистрирован: 20.07.2013 01:04:30

Re: (РЕШЕНО) Heaptrc показывает утечку памяти...

Сообщение zub » 28.11.2022 01:53:10

отлинфа в внешнем файле?
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

Re: (РЕШЕНО) Heaptrc показывает утечку памяти...

Сообщение Sharfik » 28.11.2022 04:38:02

zub писал(а):отлинфа в внешнем файле?

ага
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 760
Зарегистрирован: 20.07.2013 01:04:30

Re: (РЕШЕНО) Heaptrc показывает утечку памяти...

Сообщение Awkward » 28.11.2022 07:47:49

Всегда остаётся вариант, сформировать MAP-файл и проверить адреса по нему
Awkward
новенький
 
Сообщения: 43
Зарегистрирован: 19.01.2017 00:06:47


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

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

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

Рейтинг@Mail.ru