Текущий архив: 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.5 MB
Время: 0.069 c