Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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


ProgRAMmer Dimonych ©   (2011-11-28 12:18:00) 

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

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

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


ProgRAMmer Dimonych   (2011-11-29 01:30:00) [1]

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

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


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

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


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


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

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


Loginov Dmitry   (2011-11-28 23:31:00) [4]

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


Rouse_   (2011-11-28 23:07:00) [5]

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


Loginov Dmitry   (2011-11-28 22:14:00) [6]

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

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

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


Rouse_   (2011-11-28 12:47:00) [7]

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


OW   (2011-11-28 12:46:00) [8]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо