Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.10.28;
Скачать: CL | DM;

Вниз

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

 
Adventure ©   (2007-08-13 11:50) [0]

Господа, у кого есть опыт отслеживания и нахождения утечки памяти в программах? Все доступные в инете компоненты  "определители" либо не хотят работать при внедрении в код либо не работают.

У меня достаточно большой проект включающий и базы данных и сетевые подключения и вот в чем проблема:

1. Раз в час (приблизительно) обьем памяти выделяемый системой для данных увеличивается в 2 раза.
2. При запуске программы может появится, а может нет ошибка "Out of Memory"

Не могу понять. Весть текст перепроверил сто раз ...


 
Сергей М. ©   (2007-08-13 11:58) [1]


> Весть текст перепроверил сто раз


Проверь 101-й раз. Но теперь с использованием отладчика.


 
Adventure ©   (2007-08-13 12:00) [2]


> Проверь 101-й раз. Но теперь с использованием отладчика.

С отладчиком очень сложно. Программа многопоточная. До 30 разных Thread запускается постоянно.


 
Сергей М. ©   (2007-08-13 12:04) [3]


> С отладчиком очень сложно


А без отладчика никак, хочешь ты того или не хочешь.


> многопоточная


И что ?
Отладчик успешно справляется с этим..


 
sniknik ©   (2007-08-13 12:05) [4]

> 2. При запуске программы может появится, а может нет ошибка "Out of Memory"
используется BDE?
гдето 8-13 незакрытых сессий в нем приводит к этой ошибке. можеш проверить, сделай минимальное приложение 1 форма и одна открытая таблица (TTable) на ней, после компиляции запусти получившуюся прогу 14 раз. удалось? сообщение похоже?
если это то, то это както регулируется в настройках BDE, т.е. можно увеличить количество, но я не знаю как (и не стремлюсь узнать, т.к. не пользуюсь).

+ еще вроде похожую (если не туже самую) ошибку дает одновременное использование BDE и Jet в определенных условиях. лень описывать. давай больше исходной инфы, может узнает кто ситуацию.


 
sniknik ©   (2007-08-13 12:06) [5]

> Программа многопоточная. До 30 разных Thread запускается постоянно.
и в каждом работа с базой? ... ну вот, точно BDE.


 
Adventure ©   (2007-08-13 12:19) [6]


> используется BDE?

Да. BDE (Paradox базы)
Не нашел пока альтернативы (конкретно к этой задаче)
При запуске программы часть таблиц удаляется и создаются новые, проверяется корректность таблиц (открытие в try except), "плохие" создаются заново.

Затем одна таблица начинает заполнятся из интернета данными (до 1000 записей враз с проверкой, корректировкой,редактированием, автоподстановками из других таблиц и все в потоках. Вот в этот момент и появляется (или нет) сообщение "Out Of Memory".
Во время работы (сутки - двое) это сообщение появляет (или нет) эпизодически.


 
Adventure ©   (2007-08-13 12:45) [7]


> то это както регулируется в настройках BDE


Сделал изменения в настройках..... Пока работает. Посмотрим, что будет.

А вот, что с утечкой делать?


 
Сергей М. ©   (2007-08-13 12:51) [8]


> что с утечкой делать?


Привел бы ты хоть какой-либо код из состава своего проекта ..

Ну, скажем, код ответственный за "таблица начинает заполнятся из интернета данными" ..


 
jack128_   (2007-08-13 13:05) [9]


> Отладчик успешно справляется с этим..

нет, как раз при многопоточной отладке IDE глючит весьма и весьма. Обычно это проявляется в банальном зависании Дельфи..

---

> Adventure ©  

А FastMem - совсем не помогает??


 
Сергей М. ©   (2007-08-13 13:08) [10]


> при многопоточной отладке IDE глючит весьма и весьма


У меня ничего не "глючит" и не "зависает".
А если что-то и происходит непонятное, то это для отладки как правило непринципиально.


 
Adventure ©   (2007-08-13 13:31) [11]

Пока беру тайм аут.
После изменения настроек BDE пропала (пока) утечка.....


 
DVM ©   (2007-08-13 13:43) [12]


> Все доступные в инете компоненты  "определители" либо не
> хотят работать при внедрении в код либо не работают.

MemProof пробовал?


 
Adventure ©   (2007-08-14 16:19) [13]


> MemProof пробовал?
>

Пробую... И вот какая штука.
Обнаружилось аварийное завершение какого-то потока.
Под отладчиком - тишина, а это програмулина выдет, что:

Exception 0EEDFADE Unknown exception at 7C4EA4E1

Как найти это место в исходнике ?

Я понимаю, что вопрос может и для начинающих, но не могу сообразить.


 
sniknik ©   (2007-08-14 16:55) [14]

> Exception 0EEDFADE Unknown exception at 7C4EA4E1
> Как найти это место в исходнике ?
выделенное и есть указание "адреса", под отладчиком выполни пункт меню "Find Error..." и набери указанные цифры.


 
Сергей М. ©   (2007-08-15 09:23) [15]


> Обнаружилось аварийное завершение какого-то потока


> Как найти это место в исходнике ?


Прежде чем его искать (а ты его заведомо не найдешь с пом. Search -> Find Error), сделай общую обработку непредвиденных исключений в потоках с протоколированием.

procedure TSomeThread.Execute;
begin
 try
  ...
 execute
   on e:exception do
     WriteToLog("Thread " + IntToStr(ThreadId) + ", exception class " + e.ClassName + #10#13 + e.Message);
 end;
end;


 
Rouse_ ©   (2007-08-15 10:26) [16]

0EEDFADE? Старая ошибка. Оперативы добавь... наш комплекс на слабых тачках тоже с этой ошибкой падает, всегда добавление оперативки выручало...


 
Rouse_ ©   (2007-08-15 10:28) [17]

Обычно при выпадении 0EEDFADE если выполнить GlobalMemoryStatus то результат будет примерно такой:

Статистика использования памяти:
- Процент занятой физической памяти: 52%
- Объем физической памяти: 255 Мб
- Свободно физической памяти: 32 Мб
- Объем файла подкачки: 1794 Мб
- Свободное место в файле подкачки: 1732 Мб


 
Adventure ©   (2007-08-16 13:57) [18]

Господа, всем огромнейшее спасибо!

Все оказалось проще.
Я купил в интернете один готовый модуль (в исходниках) для своего проекта и естественно, так как это "продажный" вариант даже не рассматривал его на ошибки. А все оказалось в нем!!! Ни один динамический массив выделяемый через SetLength не освобождался, кроме того не было проверки на ошибочные данные и в непредвиденных ситуациях выделялся по Setlength обьем превышающий всю оперативку.

Еще раз спасибо всем и ... пишите проги сами.


 
Сергей М. ©   (2007-08-16 14:16) [19]


> Ни один динамический массив выделяемый через SetLength не
> освобождался


С чего ты так в этом уверен ?


> выделялся по Setlength обьем превышающий всю оперативку


Причем здесь "оперативка" ?

Менеджер памяти, к которому обращается все та же SetLength() и иже с ней функции, запрашивающие распределение/перераспределение/освобождение памяти, не оперирует оперативной памятью - вся работа идет с виртуальной памятью процесса.


 
Adventure ©   (2007-08-16 14:19) [20]


> С чего ты так в этом уверен ?


Уверен, потому, что все перепроверил и исправил. Все работает "как часы"


 
Сергей М. ©   (2007-08-16 14:23) [21]


> все перепроверил и исправил


Малацца)

Хотелось бы еще при этом верить, что о времени жизни переменных и переменных с управляемым временем жизни ты знаешь не понаслышке.


 
Adventure ©   (2007-08-16 14:30) [22]

:-)



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

Текущий архив: 2007.10.28;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.022 c
5-1161855063
DevilDevil
2006-10-26 13:31
2007.10.28
Parent = TPanel


2-1191864483
bagos
2007-10-08 21:28
2007.10.28
цветной текст в stringgrid


2-1191784004
Альберт
2007-10-07 23:06
2007.10.28
потоки


3-1182499435
Sergey__
2007-06-22 12:03
2007.10.28
Генераторы


4-1177402203
Malik
2007-04-24 12:10
2007.10.28
ChekedBox