Ошибка при закрытии программы Write of adress (Delphi)

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Dr_Grizzly
Сообщения: 407
Зарегистрирован: 13 сен 2004, 12:05
Откуда: Курган
Контактная информация:

Всем привет! Пишу прогу, все было ок, и после какого-то момента при закрытии программы стала выдавать ошибку приложения - Exception EAccessViolation in module Project1.exe at 000E4918. Access violation at address 004E4918 in module 'Project1.exe'. Write of address 01AF93E0.

Как найти эту проблему? пробовал поставить точку останова на событии Close. Курсор дошел до end. в модуле программы после Application.run и выдала ошибку... т.е. толком ничего не увидел... Может есть варианты как посмотреть что находится по этому адресу в памяти?
Чем проще - тем оригинальней, а значит гениально, т.к. все гениальное - просто! ;) Да! Кстати! Ctrl+V реально вставляет!!! ХDD
Аватара пользователя
Duncon
Сообщения: 2085
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

Утечки посмотри сначала..
FormCreate
ReportMemoryLeaksOnShutdown := true;
[syntax=Delphi] [/syntax]
Dr_Grizzly
Сообщения: 407
Зарегистрирован: 13 сен 2004, 12:05
Откуда: Курган
Контактная информация:

Подскажи по подробней где это включается?
Чем проще - тем оригинальней, а значит гениально, т.к. все гениальное - просто! ;) Да! Кстати! Ctrl+V реально вставляет!!! ХDD
Аватара пользователя
Duncon
Сообщения: 2085
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

FormCreate
[syntax=Delphi] [/syntax]
Dr_Grizzly
Сообщения: 407
Зарегистрирован: 13 сен 2004, 12:05
Откуда: Курган
Контактная информация:

Это событие OnCreate? или в Source проекта? Куда б не вписал эту функцию - компилятор ругается что неизвестная переменная
Чем проще - тем оригинальней, а значит гениально, т.к. все гениальное - просто! ;) Да! Кстати! Ctrl+V реально вставляет!!! ХDD
Аватара пользователя
Duncon
Сообщения: 2085
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

Это событие формы, как ты вообще кодиш без базовых познаний, почитай любой учебник..
[syntax=Delphi] [/syntax]
Dr_Grizzly
Сообщения: 407
Зарегистрирован: 13 сен 2004, 12:05
Откуда: Курган
Контактная информация:

Нуу, базовые знания я получил еще учась в 8 классе, параллельно заканчивая институт, просто была большая пауза в практических занятиях после теории... :-[

Про событие такое я знаю, и называется оно у меня в 6-й дельфе - OnCreate. Но сути не меняет... Компилятор не знает такой переменной/функции/процедуры, или что это (ReportMemoryLeaksOnShutdown := true ;)
Я тут погуглил инет, оказывается с 7-й версии дельфы встроили модуль FastMM. Вот он такую переменную знает. Я ж попробовал прикрутить его к моей проге. В итоге получил 3 утечки маленького размера... и кучу лога ))) Теперь как бы в нем разобратся....

ЛОГ файл... http://files.mail.ru/BJ5ODY
Чем проще - тем оригинальней, а значит гениально, т.к. все гениальное - просто! ;) Да! Кстати! Ctrl+V реально вставляет!!! ХDD
Dr_Grizzly
Сообщения: 407
Зарегистрирован: 13 сен 2004, 12:05
Откуда: Курган
Контактная информация:

Первые мысли - Дебуггер сказал что часть памяти который использовал класс TADOQuery занял TObjectList. А этот класс используется в компонентах со списками? так ведь? Значит какая-то компонента пытается обновить данные в базе уже после закрытия программы? Или тут в чем-то другом дело?

Похоже я накопал проблему. ПРога устроена так, что сначало создаются формы начиная от главной и в конце создается форма DataModule Где лежат все ADO компоненты. Первая форма на событии onActive вызывает модально вторую форму на которой находится DBLookupCombobox. Она берет данные из таблицы ADOTable. После выбора данных, происходит событие Close второй формы и фокус передается первой. А теперь самое интересное. Ставлю точку остановки на событие OnChange у компоненты DBLookup и получаю, что при закрытии проги, когда уже основная форма закрыта, происходит событие onchange, а DataModule уже закрыт... вот тут похоже и ошибка...... Ща попробую поправить это как-нибудь.... только еще не знаю как )))))

Нет.... не то похоже.... отключил связь компоненты с таблицей - а результат все тот же.....
Чем проще - тем оригинальней, а значит гениально, т.к. все гениальное - просто! ;) Да! Кстати! Ctrl+V реально вставляет!!! ХDD
Аватара пользователя
Duncon
Сообщения: 2085
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

Тут проблема ровно одна в указанных классах, точнее при работе с ними не происходит правильная очистка/удаление элементов. Соответственно нужно сидеть смотреть где элементы создаются но не удаляются либо где происходит сбой и функции удаления не срабатывают в итоге.
13 - 20 байт: TObjectList x 3
21 - 36 байт: TWinHelpViewer x 1
37 - 52 байт: THelpManager x 1
[syntax=Delphi] [/syntax]
Dr_Grizzly
Сообщения: 407
Зарегистрирован: 13 сен 2004, 12:05
Откуда: Курган
Контактная информация:

Хм.... интересно сказал ))) Если я сам не создаю ничего в коде программы, а только управляю свойствами и функциями, то как найти ошибку? Если б она зараза хоть показывала после какой строчки ошибка, ну т.е. отобразила точку останова... а то ведь ничего не говорит и не показывает, кроме того, как после закрытия всех форм и ожидания около 2х сек отображает ошибку записи памяти

Пошел методом от противного.... сделал копию проекта и стал потихоньку кромсать, запускать, закрывать и смотреть что происходит...
Сначала удалил все компоненты содержащие listbox в любом виде, будь то даже DateTime компоненты.
Результат - без изменений, т.е весь лог с одинаковым содержанием.

Удалил формы, которые опережают запуск программы(Осталась основная и вторая форма)
Результат - без изменений

Удалил все DBGrid's
Результат без изменений

Удалил все компоненты которые на формах, оставил только меню и ADO компоненты. Удалил почти весь код программы.
Запустил, завершил, в итоге получил одно только окошечко

В этом приложении происходят утечки памяти. лялялял...
13 - 20 байт: TObjectList x 3
21 - 36 байт: TWinHelpViewer x 1
37 - 52 байт: THelpManager x 1

Убрал из Uses модуль отладчика. Запустил - закрыл - ошибок нет..... Прописал модуль отладчика, только эта ошибка...

Дак что ж за чертовщина то творится, я так и не просек...... Осталось по штучно убирать компоненты и запускать каждый раз... ВОт только одна зараза, из 5 запусков в 4-х ошибка записи в память....

Хеее, сузил круг до главной формы... ошибка на главной... ищу..

ААААААААААААААААААААА!!! Получилось!!!! УРААААААААААААА!!!!!!!!!! я обозвал в процедуре переменную Indox:String а это похоже зарезервированное слово...
Чем проще - тем оригинальней, а значит гениально, т.к. все гениальное - просто! ;) Да! Кстати! Ctrl+V реально вставляет!!! ХDD
Ответить