![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| CynicRus |
|
||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 248 Регистрация: 31.5.2012 Репутация: нет Всего: 5 |
Приветствую уважаемых форумчан. Если сервак, написанный на Delphi XE 3. Чистые сокеты + IOCompltitionPorts. Работает быстро, всё вроде хорошо. Но, проработав несколько часов - раз и зависон. Интервал между зависонами абсолютно рандомный, от 2 часов...а может сутки-двое простоять.
При этом при отладке - отладчик показывает вообще какую-то ерунду. Эксепшн при дисконнекте пользователя, где следующий код:
Начинаем падение отсюда, со строки Conn.free - разрушение объекта, далее следуем в деструктор коннекта:
Оттуда - идём в очистку Buffer'а коннекта :
затем следуем в обработчик уже самой винды, и в конце концов получаем AccessViolation, а после нажатия на Ok - OSError 5, access denied. Есть у кого какие-нибудь мысли, как победить это дело? Я уже весь мозг себе сломал за неделю боёв с отладчиком |
||||||
|
|||||||
| kami |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 23 Всего: 72 |
Глюк здесь. Сделай for i:=FChunks.Count-1 downto 0 Добавлено @ 22:22 Это раз. Второе - что такое FChunks? Если TObjectList - то вообще эти телодвижения лишние, сделать OwnObjects:=True и все само уйдет. А так - еще смущает после цикла
Неее, это у меня глюк Добавлено через 6 минут и 31 секунду Вот всегда интересовало, но руки не доходят попробовать, т.к. сам такое стараюсь не писать. При Exit отработает ли finally-секция? Или стек будет порушен? Это сообщение отредактировал(а) kami - 25.3.2015, 22:23 |
||||
|
|||||
| kami |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 23 Всего: 72 |
Ну и помимо того, что в деструкторах нужно inherited, иначе память не освободится окончательно, мысля про "некрасивый exit из try-finally" мне кажется привлекательной: TTCPServer.Disconnect -> вызов деструктора TTCPConnection -> в нем CloseSocket -> опять по цепочке в TTCPServer.Disconnect, но уже с отрабатывающим exit -> глюк
|
|||
|
||||
| CynicRus |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 248 Регистрация: 31.5.2012 Репутация: нет Всего: 5 |
А вот эту цепочку то я и не узрел
UPD: да всё так же. +-. Причём, когда этот тред клинит - выходит такая картина. Сервер подключения принимает, и на этом всё. Это сообщение отредактировал(а) CynicRus - 26.3.2015, 09:06 |
|||
|
||||
| CynicRus |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 248 Регистрация: 31.5.2012 Репутация: нет Всего: 5 |
При падении - вот как выглядит стек:
![]() TTCPServerBuffered.disconnet:
А ClientThread:
Это сообщение отредактировал(а) CynicRus - 26.3.2015, 11:17 |
||||
|
|||||
| kami |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 23 Всего: 72 |
Есть подозрение, что раз непонятно, почему возникет ошибка, значит мы видим следствие. А причина совершенно в другом месте. Например - кто-то портит память, которую потом пытаемся освободить, двойной вызов Free и т.п.
Подключи FastMM в FullDebugMode, если подозрения имеют основание - он покажет всю подноготную |
|||
|
||||
| CynicRus |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 248 Регистрация: 31.5.2012 Репутация: нет Всего: 5 |
А дедлок не может вести к такому поведению? Или наоборот, где-то не хватает критсекции? Потому что я с эврикой весь код облизал, ни единой утечки:( |
|||
|
||||
| kami |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 23 Всего: 72 |
Дед Лок к AV не приведет Эврикой не пользовался, да и утечки сейчас ни при чем - от утечек может быть OutOfMemory, но не AV. А эврика умеет находить такие вещи, как попытки обращения к освобожденной памяти? К примеру, у FastMM это выглядит так (перевод далеко не дословный): "произведена попытка обращения к памяти, которая ранее была освобождена. Сейчас будет AV" "Ранее эта память была задействована: " (тут стек методов, приведший к вызову конструктора или GetMem и т.п." "Потом память была освобождена:" (тут стек вызовов до деструктора и т.п.) "Текущий стек, который приведет к AV:"... Это сообщение отредактировал(а) kami - 26.3.2015, 21:56 |
|||
|
||||
| CynicRus |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 248 Регистрация: 31.5.2012 Репутация: нет Всего: 5 |
Помедитировал ещё с отладчиком. И возникло у меня подозрение на рукописную хэш таблицу. Досталась от коллеги, который видимо писал этот класс во времена Delphi 7, когда о дженериках в Delphi ещё не мечтали. Так вот, подумал я - а может быть его просто выпилить, и заменить на дженерики? Выпилил, заменил. 6 часов - полёт нормальный, заодно сэкономил 11 мегабайт памяти в рантайме. В этом классе содержались указатели на объект, бывало, что содержался 1 и тот же указатель, под разными ключами. Так вот похоже, что из-за этой ерунды - я и получал неуловимый глюк. Когда объект уже освободился, а в хэш-таблице где-то чего-то недотиралось. Всем спасибо за внимание.
PS: TDictionary рвёт ту самоделку в клочья-) |
|||
|
||||
| kami |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 23 Всего: 72 |
||||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |