Главная страница
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
2-1322481594
jacksotnik
2011-11-28 15:59
2012.03.11
DBCombobox


15-1321561802
Юрий
2011-11-18 00:30
2012.03.11
С днем рождения ! 18 ноября 2011 пятница


15-1321309685
Дмитрий С
2011-11-15 02:28
2012.03.11
Не понимаю, зачем википедия постоянно попрошайничает.


2-1322663788
_qwerty_
2011-11-30 18:36
2012.03.11
организация работы с таблицами


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