Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2012.03.11;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.003 c
15-1321736064
Германн
2011-11-20 00:54
2012.03.11
Бродил тут


15-1321442171
OW
2011-11-16 15:16
2012.03.11
есть ли в природе какой старый FastReport? бесплатный, с сорцами


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


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


2-1322648800
wflow
2011-11-30 14:26
2012.03.11
ADOConnection. Событие onExecuteComplete





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский