Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> сообщение FastMM при завершении прилож. block has been modified after being free 
V
    Опции темы
kami
Дата 7.9.2012, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 22
Всего: 72



Доброго времени суток, уважаемые!

Второй день бьюсь над проблемой, которую мне выдает FastMM. Немного предистории:
Конфигурация: Delphi 2010, FastMM 4.97, MadExcept 3/0m.
Проблемное приложение: многопоточный сервер, все потоки - через стандартный TThread. Если завершить его (сервер, в смысле) при наличии активных подключений, то FastMM начинает ругаться (файл с руганью - во вложении).
При этом:
- все объекты нормально уничтожаются, каждый - в своем потоке (т.е. нет такого, что создан в одном, а уничтожен в другом потоке)
- финализация всех модулей (где есть секция финализации) проходит без замечаний. В секциях финализации освобождаются общие экземпляры классов, но на момент уничтожения они пусты.

После завершения финализации всего и вся - FastMM выдает вот это.

Не могу понять, в чем дело - я же не обращаюсь к уже освобожденным объектам, иначе FastMM отреагировала бы сразу же.

Есть какие-нибудь мысли?

Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  LogisticServer_MemoryManager_EventLog.txt 3,73 Kb
PM MAIL WWW   Вверх
DarkProg
Дата 7.9.2012, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Законченный романтик
***


Профиль
Группа: Завсегдатай
Сообщений: 1784
Регистрация: 11.3.2009
Где: Земля

Репутация: 4
Всего: 19



А если отключить ругань со стороны FastMM и madExcept, и отключить всё игнорирование исключительных ситуаций в самой делфи не станет ли проще локализовать проблему?

Сейчас мне так кажется, по стеку в том что в каком-то потоке вы что-то создали, а оно несколько не уничтожилось, или уничтожилось что-то одно, а какой-то объект остаётся существовать...

У меня так было при включённой опции FreeOnTerminate, получались забавные ошибки и непонятные. Я отключил её и поток руками убиваю, так лучше при конкретно моей реализации.


--------------------
"И твоя голова всегда в ответе за то куда сядет твой зад..."

"Я студент - скажите с какого я ВУЗа..."

 smile  smile  smile 
PM MAIL   Вверх
kami
Дата 7.9.2012, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 22
Всего: 72



DarkProg, в том-то и дело, что при отключении FastMM всё становится прекрасно - приложение якобы завершается нормально.
Ведь судя по логу, FastMM выбрасывает ошибку уже на самом завершающем этапе - когда происходит удаление самого менеджера памяти FastMM, т.е. в своей, последней секции финализации. На этот момент уже ничего от программы и ее объектов не осталось.

Сейчас вот убрал вообще весь код из initialization/finalization. Не помогло.

Цитата(DarkProg @  7.9.2012,  15:12 Найти цитируемый пост)
У меня так было при включённой опции FreeOnTerminate

Не пользуюсь. Из-за нее действительно могут быть проблемы, гораздо лучше самому контролировать. Да и в этом случае выскочило бы AV (ну, это мечты, конечно ).

Сейчас пытаюсь понять, чем же может отличаться завершение программы без активных TCP подключений от имеющей таковые...

Цитата(DarkProg @  7.9.2012,  15:12 Найти цитируемый пост)
и отключить всё игнорирование исключительных ситуаций в самой делфи 

Это как и где отключается? Не включал ничего в этом духе...
PM MAIL WWW   Вверх
DarkProg
Дата 7.9.2012, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Законченный романтик
***


Профиль
Группа: Завсегдатай
Сообщений: 1784
Регистрация: 11.3.2009
Где: Земля

Репутация: 4
Всего: 19



Цитата(kami @  7.9.2012,  16:23 Найти цитируемый пост)
Это как и где отключается? Не включал ничего в этом духе... 

Обычно если галочка есть, то при исключении, которое обрабатывается ничего не происходит(ну или происходит), а вот без обработчика вылетает сообщение где много букав, а толку мало.
Оно включается если при вылете Except'а под отладчиком, в диалоге поставить галочку "ignore exception"
Отключается очень просто Tools->Options->Debugger Options->Language Exceptions, и там снять все галочки.

Цитата(kami @  7.9.2012,  16:23 Найти цитируемый пост)
Сейчас пытаюсь понять, чем же может отличаться завершение программы без активных TCP подключений от имеющей таковые...

Тем что возможно обработчики каким-то чудом ещё работают...(бред больного человека, но всё же  smile )

P.S. вроде в 2010 там также было всё расположено


--------------------
"И твоя голова всегда в ответе за то куда сядет твой зад..."

"Я студент - скажите с какого я ВУЗа..."

 smile  smile  smile 
PM MAIL   Вверх
kami
Дата 7.9.2012, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 22
Всего: 72



Цитата(DarkProg @  7.9.2012,  15:33 Найти цитируемый пост)
Отключается очень просто Tools->Options->Debugger Options->Language Exceptions, и там снять все галочки.

Не, я такими вещами не балуюсь smile Как стояло по умолчанию игнорировать только Indy, так и стоит. Полностью солидарен в этом с Delphi - я тоже игнорирую индейцев.

В общем, разобрался и нашел. Как обычно - совсем не там, куда указывалось FastMM. Хотя, надо признать - причина лежала рядом, совсем рядом.

Порядок разбора был следующим:
0. Ошибка стабильная, повторяется 1:1 при одинаковых действиях с программой (огромная удача, если честно).
1. Проверил, что при нормальном завершении TCP соединения ошибок не возникает, а если завершение соединения вызывано завершением работы сервера (прошу прощения за тавтологию) - то ошибка имеет место быть.
2. Промежуточный вывод - проблема действительно в коде обработчиков закрытия сокетов и "окололежащих с ними".
3. Просмотр всего кода, относящегося к завершению соединения с обдумыванием "а как оно действует при завершении программы"
4. Нашел узкий участок - относительно сложная связь экземпляров классов через события. Оказалось, что из-за этой связи может быть вызван метод принудительного завершения соединения, что само собой лишнее - соединение и так уже закрывается (программа-то завершается).
5. Ликвидировал двойной вызов (просто обnilил событие в деструкторе)
6. Наслаждаюсь. Правда, недолго - теперь проблема (уже другого плана) на клиенте  smile
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0447 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.