Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "KOL";
Текущий архив: 2008.04.06;
Скачать: [xml.tar.bz2];

Вниз

Утечка памяти в dll   Найти похожие ветки 

 
Delphuk ©   (2007-08-14 23:45) [0]

Добрый вечер. Опять заметил утечку памяти при использовании MCK формы из dll. Утечка происходит из-за каких то стандартный KOL&MCK компонентов. Предположение сделано после небольшого эксперимента. 1. Была написана dll (плагин), в которой находится форма и две кнопки. Написан код инициализации плагина и процедура вызова формы (аналогично демке DemoVCL2KOLDLL). Из хост приложения происходит вызов формы из dll, всё хорошо. Выделяется память под эту форму, после закрытия которой, память не освобождается.
2. Написана вторая dll, код которой полностью идентичен первой, только на форме расположены другие компоненты. После закрытия этой формы, память частично освобождается. Но после следующих вызовов формы, каждый раз получается прирост в 24кб.

Вот примеры этих плагинов с исходниками и хост программа:
<url=http://www.sendspace.com/file/7ps5or>1й плагин (26кб)</url>
<url=http://www.sendspace.com/file/u96mw5>2й плагин (43кб)</url>
<url=http://rnq.ru/RnQ/RnQ1072.rar>RnQ (1,3Мб) (программа для которой и пишется плагин)</url>

Используется KOL&MCK 2.72 без замены системных модулей, Delphi 6, WinXP+SP2

Пожалуйста помогите решить эту проблему.


 
Delphuk ©   (2007-08-14 23:48) [1]

Вот примеры этих плагинов с исходниками и хост программа:
http://www.sendspace.com/file/7ps5or 1й плагин (26кб)
http://www.sendspace.com/file/u96mw5 2й плагин (43кб)
http://rnq.ru/RnQ/RnQ1072.rar RnQ (1,3Мб) (программа для которой и пишется плагин)


 
Vladimir Kladov   (2007-08-15 01:18) [2]

Совсем не интересно качать программу размером 1.3 Мбайта, особенно на дохлом gprs"е. Лучше так давайте: вы делаете рабочий симулятор этой программы, который вызывает ваши плагины, и выкладываете его исходники. Или говорите, каким инструментом вы обнаруживаете утечку, и обнаруживает ли этот же инструмент утечку в демо-примере. Кстати, в демо вложен вариант с исходниками для хост приложения на С++.  С помощью memproof никаких утечек обнаружить не удалось, по крайней мере. Думаю, что если утечка есть, то виновато хост-приложение всё-таки.


 
Delphuk ©   (2007-08-15 01:46) [3]

Утечку обнаруживаю банальным виндовым диспетчером задач. Запускаю прогу, вызываю форму из плагина. Смотрю сколько памяти занимало хост приложение до и после вызова. Потом повторяю вызов формы. Так и замечаю, что после каждого вызова, хост приложение "полнеет" на 24 кг.

Думаю, что если утечка есть, то виновато хост-приложение всё-таки.
Я тоже так думал, поэтому два примера. Код полностью такой же, разница только в компонентах расположенных на форме. Однако, в плагине только с формой и кнопками, хост приложение "не полнеет" после каждого вызова формы. А во втором случае наблюдается прирост на 24кб. Мне кажется не все контролы уничтожаются после закрытия формы.

Совсем не интересно качать программу размером 1.3 Мбайта, особенно на дохлом gprs"е
Владимир, я сам сижу в инете через GPRS, 1,3 Мб не так уж и много.


 
Vladimir Kladov   (2007-08-15 01:58) [4]

Диспетчер задач не обнаруживает УТЕЧЕК. Он всего лишь показывает, сколько памяти распределено задаче. Эта величина вообще может расти до небес, а потом вдруг перестать расти, потому что планировщик памяти системы вдруг "вспомнит", что задача вырнула ему какой-то кусок памяти, и тогда он его утилизирует, опять для этой задачи, или для другой. Но пока у системы нет проблем с памятью, и все задачи довольны, ему нет необходимости заниматься сбором мусора, он и не тратит время попусту, просто выделяя по очередному запросу очередной кусок памяти, отрезая его от большого пула физ. блоков.

У меня на даче действительно ОЧЕНЬ дохлый gprs. 1Мбайт ~ 1час.


 
Delphuk ©   (2007-08-15 02:03) [5]

Хорошо, тогда почему в первом случае всё норм, а во втором нет? Код один и тот же.


 
Vladimir Kladov   (2007-08-15 06:22) [6]

Где же хорошо сми пишете: 1. Была написана dll (плагин), в которой находится
форма и две кнопки. Написан код инициализации плагина и процедура вызова формы (аналогично демке DemoVCL2KOLDLL). Из хост
приложения происходит вызов формы из dll, всё хорошо. Выделяется память под эту форму, после закрытия которой, память не
освобождается.


Я решил что в обоих случаях плохо :)

Все равно диспетчер задач не тот инструмент, которым утечки смотрятся. Надо смотреть под мемпруфом, он покажет хотя бы какая память (размер блока), если есть исходник (а он есть) - в каком месте выделена. Если у вас не 20 строк кода то иначе искать кроме вас никто не захочет, если только делать совсем нечего.


 
Delphuk ©   (2007-08-15 16:33) [7]

Не :) не всё так плохо. В первом случае память конечно не освобождается, но после первого вызова формы, хост-приложение больше "не полнеет" т.е. после показа формы, занимаемая память не прибавляется (после следующих вызовов) и не освобождается. Размер хост-приложения стабильно держится на одном уровне. А во втором случае (где больше компонентов на форме), и память не освобождается, и после последующих вызовов хост-приложение постоянно "толстеет" на 24Кб.
Вот у меня и вопрос, почему так происходит? Ведь код 100% один и тот же.


 
Vladimir Kladov   (2007-08-15 18:51) [8]

Хотел посмотреть хотя бы на коды плагинов: не грузятся. Висит на месте где должен быть линк: link is loading... Т.е. даже не файл, а линк. Со slil.ru у меня само грузить начинает сразу.


 
Vladimir Kladov   (2007-08-15 19:09) [9]

Наконец-то качнул. Без хост-прилодения конечно Вот такой совет коли не хотите мемпруфом: назначьте OnDestroy на саму форму и на несколько контролов и других объектов, запустите под отладчиком, и проверьте срабатывают ли OnDestroy.



Страницы: 1 вся ветка

Форум: "KOL";
Текущий архив: 2008.04.06;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.007 c
15-1203516867
@!!ex
2008-02-20 17:14
2008.04.06
Помогите информацией об использовании UDP


15-1203510685
Raven
2008-02-20 15:31
2008.04.06
Процедура для изучения Delphi для новичков :)


15-1203855301
keymaster
2008-02-24 15:15
2008.04.06
Проблема с запуском Turbo Delphi под Vista


3-1195200086
opoloXAI
2007-11-16 11:01
2008.04.06
Microsoft.Jet.OLEDB.4.0 : ошибка в строке "Sum()"


2-1205035977
Adios
2008-03-09 07:12
2008.04.06
как узнать имя файла шривта по названию шрифта





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский