SASGIS - SACS.Планета
View Issue Details
0001857SACS.Планета[All Projects] Багpublic14-03-2013 18:4409-08-2013 15:13
zed 
vasketsov 
normalminoralways
closedfixed 
 
130803 
0001857: Утечка памяти при закрытии программы
Утечка большая и похоже что где-то что-то глобально не освобождается, потому как в отчёте куча не связанных классов светится.

Утечка живёт уже довольно давно, всё было лень на неё обращать внимание. Думалось: авось само уйдёт.
No tags attached.
? SASPlanet.elf (122,707) 15-03-2013 18:12
http://www.sasgis.org/mantis/file_download.php?file_id=1316&type=bug
? SASPlanet_SMALL.elf (64,917) 15-03-2013 20:58
http://www.sasgis.org/mantis/file_download.php?file_id=1317&type=bug
? SASPlanet.Debug.elf (21,283) 17-03-2013 06:07
http://www.sasgis.org/mantis/file_download.php?file_id=1318&type=bug
? SASPlanet_SACS_0.elf (82,265) 02-04-2013 18:59
http://www.sasgis.org/mantis/file_download.php?file_id=1328&type=bug
Issue History
14-03-2013 18:44zedNew Issue
14-03-2013 18:44zedFile Added: SASPlanet.elf
14-03-2013 21:04vasketsovNote Added: 0010872
14-03-2013 21:05zedNote Added: 0010873
14-03-2013 21:17vasketsovNote Added: 0010875
15-03-2013 08:09zedNote Added: 0010880
15-03-2013 11:22vasketsovNote Added: 0010893
15-03-2013 13:16vasketsovNote Added: 0010904
15-03-2013 14:17vasketsovNote Edited: 0010904bug_revision_view_page.php?bugnote_id=10904#r5273
15-03-2013 18:12vasketsovNote Added: 0010909
15-03-2013 18:12vasketsovFile Deleted: SASPlanet.elf
15-03-2013 18:12vasketsovFile Added: SASPlanet.elf
15-03-2013 20:58vasketsovNote Added: 0010911
15-03-2013 20:58vasketsovFile Added: SASPlanet_SMALL.elf
17-03-2013 06:07FetserFile Added: SASPlanet.Debug.elf
17-03-2013 06:08FetserNote Added: 0010915
02-04-2013 18:59vasketsovNote Added: 0010965
02-04-2013 18:59vasketsovFile Added: SASPlanet_SACS_0.elf
03-04-2013 04:41zedNote Added: 0010966
03-04-2013 05:29vasketsovNote Added: 0010967
03-04-2013 10:13vasketsovNote Added: 0010968
03-04-2013 10:19vasketsovNote Added: 0010969
03-04-2013 15:30vasketsovNote Added: 0010970
03-04-2013 17:46zedNote Added: 0010973
03-04-2013 17:50zedNote Edited: 0010973bug_revision_view_page.php?bugnote_id=10973#r5288
03-04-2013 19:56vasketsovNote Added: 0010979
03-04-2013 20:11zedNote Added: 0010982
03-04-2013 20:17vasketsovAssigned To => vasketsov
03-04-2013 20:17vasketsovStatusnew => assigned
03-04-2013 20:18vasketsovStatusassigned => resolved
03-04-2013 20:18vasketsovResolutionopen => fixed
09-08-2013 14:59vasketsovFixed in Version => 130803
09-08-2013 15:13vasketsovStatusresolved => closed

Notes
(0010872)
vasketsov   
14-03-2013 21:04   
Выборочно глянул - всё по-старому.
Эти сообщения об утечках генерятся для "интерфейсов", которые не убиты в деструкторе ввиду отсутствия такового. Как заставить эврекалог анализировать утечки после того как всё сольётся из автоматических деструкторов - я не знаю.
(0010873)
zed   
14-03-2013 21:05   
В SAS такой утечки нету.
(0010875)
vasketsov   
14-03-2013 21:17   
Ну просто там какой-нибудь глобальный деструктор более полный, больше разных Fxxx := nil; прописано, вот и вся разница.
Ну коли настаиваешь - погляжу. Я как-то уже пытался понаходить чего не слито, нашёл только не написанные руками автодеструкторы.
(0010880)
zed   
15-03-2013 08:09   
Такое чувство, что не уничтожается сам TGlobalState и всё что он хранит.
(0010893)
vasketsov   
15-03-2013 11:22   
Близко ))
Я тут запустил из-под дельфи с эврикой, поигрался параметрами
UseMozilla=0
UseInternalHttpd=0
(это при том, что сас у мня не в одном экземпляре сейчас запущен).
И обнаружил, что утечка возникает уже при UseMozilla=1 (присто запускаю, жду когда запустится, выключаю).
Так что похоже между DLL и хостом что-то не пролетает, или референс, или эврика.
(0010904)
vasketsov   
15-03-2013 13:16   
(edited on: 15-03-2013 14:17)
Не освобождается в момент смерти GState даже TInternalDomainInfoProviderByMapTypeList
а с ним и TZmpInfoSet
потому и тянется всё ))

зы. Один косяк нашёл, не убивается TfrmMarkInfo, ибо не InterfacedObject ((.

(0010909)
vasketsov   
15-03-2013 18:12   
Пописал TfrmMarkInfo на коленке - стало убиваться.

А вот почему TMarkPictureListSimple не умирает - не могу найти.

В общем "утечки" те же самые, в деструкторах подобавлял убийств - сильно не полегчало. Но оставил.

А заходно пофиксил небольшую кучку багов, которые почему-то стреляли только в дебаге (в scriptcontrol и в httpd) и если не повезёт - не давали при закрытии проги ей спокойно умереть.
(0010911)
vasketsov   
15-03-2013 20:58   
Если в u_BaseInterfacedObject заменить под DEBUG TBaseInterfacedObjectDebug на TInterfacedObject - число утечек уменьшаетя почти вдвое, аттач приаттачен
(0010915)
Fetser   
17-03-2013 06:08   
Версия Nightly.130317.263 продолжает ругаться (elf приложил)
(0010965)
vasketsov   
02-04-2013 18:59   
SASPlanet_SACS_0.elf - сгенерён эврикой для 0-й ревизии в SACS. Открыл и закрыл.
(0010966)
zed   
03-04-2013 04:41   
Ты просто отнаследовался от неудачной версии. Но похоже, что там потом были доработки, которые к тебе не попали, потому утечка так и осталась.

Кстати, может связано: у САСа сейчас 2 варнига, а у тебя 3.
(0010967)
vasketsov   
03-04-2013 05:29   
Я не вижу доработок, касающихся например
Type=TBitmap32StaticStandartSize; Total size=14681632; Count=56
(0010968)
vasketsov   
03-04-2013 10:13   
Вот из интересного:
Type=TUserAccessRights; Total size=72; Count=1
Type=TContentTypeManagerSimple; Total size=964; Count=1
Type=TMarkPictureListSimple; Total size=136; Count=1
Type=TMarkCategoryFactoryConfig; Total size=296; Count=1
Type=TBitmap32StaticStandartSize; Total size=14681632; Count=56
Type=TMarkPictureSimple; Total size=8736; Count=84

В общем-то ноги во многом растут из TMarkPictureListSimple, остальные тащатся по ссылкам за ним.

Рещил разобраться с первым (TUserAccessRights) ибо он новый, его нет в SAS и он ещё не так глубоко размножился, как например MarkPictureList или ContentTypeManager. Всё проверил гд есть, даже with переписал, мало ли компилеру башню снесло - и никаких изменений.

Но закоментировал кусок в самом низу TGlobalState.LoadConfig (прямо целиком if (not ModuleIsLib) then begin end) где:
FUserAccessRights.ReadConfig(MainConfigProvider.GetSubItem('UserAccess_Restrictions'));
FMarksCategoryFactoryConfig.ReadConfig(MainConfigProvider.GetSubItem('MarkNewCategory'));

Естественно при запуске настройки слетели на дефолтные.
Однако при выключении эврека промолчала.
Раскомментировал назад (как было). Запустил. Закрыл. Эврека опять промолчала. И даже точки остановка внутри TMarkPictureListSimple.Destroy и в деструкторе пула битмапок стали посещаться.

Какого хрена данные в ini влияют на подсчёт ссылок, и что такого в ReadConfig делается (или соответственно не делается), что такая хрень происходит - сказать пока что сложно. Но ситуация начинает напрягать.
(0010969)
vasketsov   
03-04-2013 10:19   
Думаю что связано с метками в SQLite, так как по умолчанию (без ini) метки в SML.
(0010970)
vasketsov   
03-04-2013 15:30   
Проблема была в Self в конструкторе TMarksSQLDb.Create.
Заодно поисправлял кучу опечаток, порефакторил и пооптимизировал всякой ерунды.
(0010973)
zed   
03-04-2013 17:46   
(edited on: 03-04-2013 17:50)
>Проблема была в Self в конструкторе TMarksSQLDb.Create.
Насколько я вижу, проблема с утечкой ещё жива. К тому же, ещё и кэш SQLite начал высвечиваться в логе.

О, после этого коммита перестало течь :)

(0010979)
vasketsov   
03-04-2013 19:56   
В SQLite были свои утечки, и тоже когда в качестве интерфейса отдаётся Self.
Сейчас эврикалог пишет про утечки в SQLite только если там что-то по исключению валится (например SQL-запрос кривой), хотя исключения душатся и складируются в лог (и что там может утечь и как - пока не могу понять).
(0010982)
zed   
03-04-2013 20:11   
Ну, этот баг можешь закрывать. Той утечки, о которой была речь уже нету. А что подтекает тестовый SQLite-кэш, так тож ещё в процессе может сто раз полечиться.