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

Вниз

Определить, кто освобождает память   Найти похожие ветки 

 
ProgRAMmer Dimonych ©   (2011-11-28 12:18) [0]

Есть проект на D2007, из которого, выбирая ту или иную конфигурацию сборки, можно собрать 5 разных EXEшников. Я добавляю в проект кусок кода, обеспечивающий работу с ключом Guardant. После этого 4 из 5 приложений работают нормально, а 5-е начинает вылетать при завершении, когда завершается тело основной программы и начинает выполняться удаление форм.

В отладчике видно, что происходит AV при удалении одной из кнопок в панели инструментов: она в деструкторе обращается по адресу, хранящемуся в её поле, за 4мя байтами адреса ещё какой-то структуры, но эти байты оказываются затёртыми. Затираются они где-то в недрах деструктора формы, при вызове StrAlloc(). Отсюда я делаю вывод, что блок памяти, к которому пытается обращаться кнопка, уже кем-то освобождён.

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


 
OW ©   (2011-11-28 12:46) [1]

бряк на память


 
Rouse_ ©   (2011-11-28 12:47) [2]

FastMM иногда показывает...


 
Loginov Dmitry ©   (2011-11-28 22:14) [3]

При добавлении в проект EXE новых форм они регистрируются в файле проекта *.dpr и автоматически создаются при запуске приложения. Проверь, нет ли в dpr чего лишнего.
Это лишь один из миллиона вариантов, в чем может быть проблема.

Проверяй все finalization, деструктор главной формы, если используются доп. потоки, проверяй код их завершения.
Если используются DLL, то это отдельная и очень длинная песня.
Если используется какой-то сторонний модуль для работы с Guardant, то, пожалуй, следует начать именно с него (ведь без него все работает?)

Отладка может выручить, но не факт.


 
Rouse_ ©   (2011-11-28 23:07) [4]

Да тут явно ни при чем ни библиотеки ни потоки ни прочее - на лицо банальная неаккуратная работа с памятью, что явно показывает реюз блока при StrAlloc


 
Loginov Dmitry ©   (2011-11-28 23:31) [5]

Ну так ведь и я про то же!)
Автору лишь осталось найти то самое место.


 
Германн ©   (2011-11-29 00:10) [6]


> а 5-е начинает вылетать при завершении, когда завершается
> тело основной программы и начинает выполняться удаление
> форм.

"Вылет при завершении". Это мне не совсем понятный термин. "Вылететь" может работающая программа из-за некоей ошибки. Тогда она прекращает из-за этого свою работу.
"AV при завершении". Это мне знакомо. Сталкивался в своей программе. Избавился от него тем, что при завершении программы сначала остановил таймер. :)
P.S. Это так. Информация к размышлению.


 
Loginov Dmitry ©   (2011-11-29 00:14) [7]

вот, уже второй вариант. Осталось 999998 ;)


 
ProgRAMmer Dimonych ©   (2011-11-29 01:30) [8]

Спасибо за идеи, предложения и предположения. Завтра (ой, уже сегодня) буду проверять.

Добавляемый код - чисто свой, проверялся отдельно на тестовом приложении, очень долго и жестоко. Вылетает главный поток, вспомогательные завершаются корректно. DLL у разработчиков защищаемого продукта, к сожалению, используются, да и вообще код, мягко говоря, грязноват и дурнопахнущ - так что остаётся надеяться, что ограничится какой-нибудь мелочью. Про таймеры как-то в голову не пришло, завтра "прогуглю" проект :)



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

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

Наверх




Память: 0.49 MB
Время: 0.008 c
1-1288777384
ArtemKolesnikov
2010-11-03 12:43
2012.03.11
OLE Word. Как вставить формулу со знаком корня?


15-1321514725
DelphiN!
2011-11-17 11:25
2012.03.11
Сервер для хранения приложений для запуска их на клиентах


2-1322641073
_qwerty_
2011-11-30 12:17
2012.03.11
работа с bookmark


11-1223651817
WebBrowserHater
2008-10-10 19:16
2012.03.11
Вопрос о KOLWebBrowser


2-1322553903
jacksotnik
2011-11-29 12:05
2012.03.11
Сохранение данных с помошью POST