Конференция "Основная" » Тихо умирающее приложение [D7, WinXP]
 
  • AlexNe (05.07.08 18:41) [0]
    Уважаемые эксперты! Похоже я своими стараниями попал
    в ситуацию из которой пока не вижу выхода.
    Суть проблемы:
    Имеется приложение, работающее с различными удаленными серверами через TSocketConnection, c базой данных Interbase, и с сервером реального времени, который крутится на DOS машине - соотв. через синхронный сокет TIdTCPClient.
    Для работы с каждым сервером имеется отдельный поток,
    причем поток сокета TIdTCPClient имеет наивысший приоритет.
    Приложение работает под WinXP,  работает без замечаний иногда 9 часов, иногда 3, затем элегантно, без каких либо сообщений схлопывается (а следом закрываются сервера).
    Отслеживание возникающих исключений
    (посылка сообщений из Application.OnException другой программе) не дало ничего - все чисто до самого схлопывания.
    Запустить программу надолго под отладчиком Delphi я не имею возможности.
    Безуспешные попытки найти причину доводят меня до отчаяния.
    Уже вырубил на всех TSocketConnection  свойство SupportCallBacks в False. Во всех Еxecute потоков защитил в
    try-except все что только возможно - не помогает!

    Может быть кто-нибудь сталкивался с похожей ситуацией при работе с потоками, или подскажет хотябы в какую сторону искать. Буду признателен за любые замечания
  • Loginov Dmitry © (05.07.08 18:59) [1]
    > или подскажет хотябы в какую сторону искать.


    Копать следует путем записи в лог всего и вся (все действия приложения, все сообщения об ошибках с указанием ID потока), а потом часами сидеть и анализировать зависимости между записанными в лог строчками.

    Загляни также в системный журнал работы ОС. Из него порой удается извлечь толк.
  • Сергей М. © (05.07.08 19:20) [2]

    > приложение, работающее с различными удаленными серверами .. схлопывается


    > следом закрываются сервера


    Полный трындец - рухнул кривой самопальный клиент, и в солидарность ему тут же рухнул сервер-бренд)

    Или нет ? Или совсем не так дело обстоит ?)
  • AlexNe (05.07.08 19:38) [3]
    Одна из возможных причин схлопывания, как мне думалось, возникновение 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;

    обнаружил, что в потоке образуется за секунду куча исключений, которые
    не выводятся на экран! Ну и через некоторое время операционка очевидно
    убивает приложение.
    Фишка в том, что эти ошибки я выловил и убрал, а проблема осталась!

    Системный журнал щас пойду копать, спасибо за совет.
  • AlexNe (05.07.08 19:41) [4]
    to Сергей М.
    не, сервера тоже самопальные :)  
    они и должны в случае пропадания всех клиентов закрываться.
    А трындец действительно полный.
  • Loginov Dmitry © (05.07.08 19:41) [5]
    > except
    >   Txt := 'Интересующие параметры';
    >   cds.cbData := length (Txt);
    >   cds.lpData := PChar (Txt);
    >   SendMessage (hwnd, wm_CopyData, 0, Integer (@cds));
    > end;


    А оригинальный текст сообщения об ошибке разве не интересует?
  • AlexNe (05.07.08 19:56) [6]
    Нет, ну конечно, там стоит Exception.Message когда оно есть, плюс номер тика, когда случилось. Или я чего-то не понял? В смысле засунуть туда HandleException?
  • AlexNe (05.07.08 20:03) [7]
    Просмотр системного журнала показал наличие серии ошибок Source="Application Error"   Category= "None" Event=1000 но с моментами вылетов эти серии слабо кореллируют
  • Loginov Dmitry © (05.07.08 20:19) [8]
    > Или я чего-то не понял?


    да фик тебя знает. Я имел ввиду следующее:

    try

    except
     on E: Exception do
       WriteToLog(E.Message);
    end;

  • Сергей М. © (05.07.08 21:03) [9]

    > не, сервера тоже самопальные


    Не, тады твоим потугам точно трындец)

    Бо ты нишиша не знаешь, что . где, когда и при каких обстоятельствах у тебя чего-то там "попадает".

    Ты отладчик-то пользуешь, чудо ?)
    Или на бубен уповаешь ?)
  • AlexNe (05.07.08 21:10) [10]
    to Loginov Dmitry
    прошу прощения, у меня уже из-за этой проблемы фокус сбивается...
    Может быть стоит. Только это ничего не даст - в програме после
    каждого  try except стоят WriteToLog (т.е SendMessage) , и еще
    тестировалось с обработчиком Application.OnException, который как раз
    записывал в лог E.Message. Так вот, за ночь ни одной записи об исключительных ситуациях и при этом два схлопывания. То есть, когда начинается разрушение, либо SendMessage не работает, либо черт знает вообще что....
  • AlexNe (05.07.08 21:12) [11]
    to Сергей М.
    на бубен, на бубен
  • Сергей М. © (05.07.08 21:17) [12]
    Ну тады тряси)
    Авось само рассосется)

    Небеса, панимаишь ..
  • Дмитрий Белькевич © (05.07.08 21:17) [13]
    Удалённую отладку используй. Гарантированно Excpeption'ы покажет, да еще и потрассировать даст. Очень помогает, бывает. Особенно, когда клиент на другой стороне шарика ;)
  • AlexNe (05.07.08 21:21) [14]
    Собственно проблема возникла после замены асинхронного, но кривого TClientSocket на не кривой, но синхронный  TIdTCPClient для работы с сервером под DOS. Соответственно пришлось засунуть TIdTCPClient  в отдельный поток, а потом и все остальные обращения к серверам рассовать по потокам. И в общем все стало работать много лучше, но в отместку этот глюк!
  • Дмитрий Белькевич © (05.07.08 21:21) [15]
    Даже мёртвый поток, кстати, после exception'а может OnTerminate вызвать, если его обработать, конечно. А (Sender as TThread).FatalException иногда интересные данные отдаёт.
  • Дмитрий Белькевич © (05.07.08 21:23) [16]
    Можно еще попробовать Indy обновить до актуальных.
  • Сергей М. © (05.07.08 21:30) [17]

    > кривого TClientSocket на не кривой, но синхронный  TIdTCPClient


    Эдаких клоунов, зафиксировавших сей факт,  - пруд пруди)
  • AlexNe (05.07.08 21:38) [18]
    to Дмитрий Белькевич
    Спасибо, попробую. Насколько понял из хелпа это для серверов под виндой. Есть еще Interbase, но он не падал и ничего особенного не ругался. Досовский сервер пишет подробный лог, пойду его копать.
    Про OnTerminate и (Sender as TThread).FatalException напиши завтра, т.к. систему забрали а работу и поэкспериментировать до утра не смогу.
  • Дмитрий Белькевич © (05.07.08 21:39) [19]
    Угу, всё в потоках замечательно работает. Сотни потоков.
 
Конференция "Основная" » Тихо умирающее приложение [D7, WinXP]
Есть новые Нет новых   [134491   +13][b:0][p:0.001]