-
Уважаемые эксперты! Похоже я своими стараниями попал в ситуацию из которой пока не вижу выхода. Суть проблемы: Имеется приложение, работающее с различными удаленными серверами через TSocketConnection, c базой данных Interbase, и с сервером реального времени, который крутится на DOS машине - соотв. через синхронный сокет TIdTCPClient. Для работы с каждым сервером имеется отдельный поток, причем поток сокета TIdTCPClient имеет наивысший приоритет. Приложение работает под WinXP, работает без замечаний иногда 9 часов, иногда 3, затем элегантно, без каких либо сообщений схлопывается (а следом закрываются сервера). Отслеживание возникающих исключений (посылка сообщений из Application.OnException другой программе) не дало ничего - все чисто до самого схлопывания. Запустить программу надолго под отладчиком Delphi я не имею возможности. Безуспешные попытки найти причину доводят меня до отчаяния. Уже вырубил на всех TSocketConnection свойство SupportCallBacks в False. Во всех Еxecute потоков защитил в try-except все что только возможно - не помогает! Может быть кто-нибудь сталкивался с похожей ситуацией при работе с потоками, или подскажет хотябы в какую сторону искать. Буду признателен за любые замечания
-
> или подскажет хотябы в какую сторону искать.
Копать следует путем записи в лог всего и вся (все действия приложения, все сообщения об ошибках с указанием ID потока), а потом часами сидеть и анализировать зависимости между записанными в лог строчками.
Загляни также в системный журнал работы ОС. Из него порой удается извлечь толк.
-
> приложение, работающее с различными удаленными серверами .. схлопывается
> следом закрываются сервера
Полный трындец - рухнул кривой самопальный клиент, и в солидарность ему тут же рухнул сервер-бренд)
Или нет ? Или совсем не так дело обстоит ?)
-
Одна из возможных причин схлопывания, как мне думалось, возникновение Exceptions внутри execute потока. Действительно, когда снабдил потоки механизмом передачи логов - что-то вроде
procedure TMainTread.Execure; var Hwnd: THandle; Txt: string; cds: CopyDataStruct; begin .......... try ..... except Txt := 'Интересующие параметры'; cds.cbData := length (Txt); cds.lpData := PChar (Txt); SendMessage (hwnd, wm_CopyData, 0, Integer (@cds)); end; ......... end;
обнаружил, что в потоке образуется за секунду куча исключений, которые не выводятся на экран! Ну и через некоторое время операционка очевидно убивает приложение. Фишка в том, что эти ошибки я выловил и убрал, а проблема осталась!
Системный журнал щас пойду копать, спасибо за совет.
-
to Сергей М. не, сервера тоже самопальные :) они и должны в случае пропадания всех клиентов закрываться. А трындец действительно полный.
-
> except > Txt := 'Интересующие параметры'; > cds.cbData := length (Txt); > cds.lpData := PChar (Txt); > SendMessage (hwnd, wm_CopyData, 0, Integer (@cds)); > end;
А оригинальный текст сообщения об ошибке разве не интересует?
-
Нет, ну конечно, там стоит Exception.Message когда оно есть, плюс номер тика, когда случилось. Или я чего-то не понял? В смысле засунуть туда HandleException?
-
Просмотр системного журнала показал наличие серии ошибок Source="Application Error" Category= "None" Event=1000 но с моментами вылетов эти серии слабо кореллируют
-
> Или я чего-то не понял?
да фик тебя знает. Я имел ввиду следующее:
try
except
on E: Exception do
WriteToLog(E.Message);
end;
-
> не, сервера тоже самопальные
Не, тады твоим потугам точно трындец)
Бо ты нишиша не знаешь, что . где, когда и при каких обстоятельствах у тебя чего-то там "попадает".
Ты отладчик-то пользуешь, чудо ?) Или на бубен уповаешь ?)
-
to Loginov Dmitry прошу прощения, у меня уже из-за этой проблемы фокус сбивается... Может быть стоит. Только это ничего не даст - в програме после каждого try except стоят WriteToLog (т.е SendMessage) , и еще тестировалось с обработчиком Application.OnException, который как раз записывал в лог E.Message. Так вот, за ночь ни одной записи об исключительных ситуациях и при этом два схлопывания. То есть, когда начинается разрушение, либо SendMessage не работает, либо черт знает вообще что....
-
to Сергей М. на бубен, на бубен
-
Ну тады тряси) Авось само рассосется)
Небеса, панимаишь ..
-
Удалённую отладку используй. Гарантированно Excpeption'ы покажет, да еще и потрассировать даст. Очень помогает, бывает. Особенно, когда клиент на другой стороне шарика ;)
-
Собственно проблема возникла после замены асинхронного, но кривого TClientSocket на не кривой, но синхронный TIdTCPClient для работы с сервером под DOS. Соответственно пришлось засунуть TIdTCPClient в отдельный поток, а потом и все остальные обращения к серверам рассовать по потокам. И в общем все стало работать много лучше, но в отместку этот глюк!
-
Даже мёртвый поток, кстати, после exception'а может OnTerminate вызвать, если его обработать, конечно. А (Sender as TThread).FatalException иногда интересные данные отдаёт.
-
Можно еще попробовать Indy обновить до актуальных.
-
> кривого TClientSocket на не кривой, но синхронный TIdTCPClient
Эдаких клоунов, зафиксировавших сей факт, - пруд пруди)
-
to Дмитрий Белькевич Спасибо, попробую. Насколько понял из хелпа это для серверов под виндой. Есть еще Interbase, но он не падал и ничего особенного не ругался. Досовский сервер пишет подробный лог, пойду его копать. Про OnTerminate и (Sender as TThread).FatalException напиши завтра, т.к. систему забрали а работу и поэкспериментировать до утра не смогу.
-
Угу, всё в потоках замечательно работает. Сотни потоков.
|