Форум: "Потрепаться";
Текущий архив: 2006.01.22;
Скачать: [xml.tar.bz2];
ВнизОтладка DCOM-сервера Найти похожие ветки
← →
Сатир (2005-12-24 18:14) [0]Ув. Мастера!
Подскажите, как отладить сабж. Он скомпилирован в экзешник и зарегистрирован в системе. Когда запускаю его под средой и запускаю клиент, то в памяти создаётся другая копия сервера, а запущенная под средой не принимает запросы от клиента. И как можно отлаживать клиент и сервер одновременно.
Заранее благодарен за помощь
← →
имя (2005-12-24 19:09) [1]Удалено модератором
← →
Сатир (2005-12-24 19:29) [2]но ведь многие программисты по выходным работают, а по будням отдыхают
← →
Набережных С. © (2005-12-24 22:03) [3]Группа проектов.
← →
Сатир (2005-12-25 18:17) [4]
> Группа проектов.
а можно поподробней?
с какими параметрами запускать сервер и клиент?
← →
tesseract © (2005-12-26 10:28) [5]Если Com-server твой, то проблем не возникает - Integrated Debugging включаешь и отлаживаешь.
Группа проектов просто позволит ставить breakpoints одновременно в коде клиента так и сервера.
← →
Сатир (2005-12-26 17:15) [6]
> Integrated Debugging включаешь
а где его включать?
Да, кстати о сервере: для соединения используется TSocketConnection вместо TDCOMConnection и Borland Socket Server.
Так в среде мне запускать сервер или клиент?
← →
Набережных С. © (2005-12-26 18:41) [7]
> Сатир
> > Integrated Debugging включаешь
>
> а где его включать?
Он и так включен, в окне Tools/Debugger options, трогать не надо.
> Так в среде мне запускать сервер или клиент?
Конечно можно. Создаешь группу проектов - Project Group в репозитарии, включаешь в нее оба проекта, собираешь оба с включением отладочной информации, далее делаешь Compile All - именно компиляцию, не сборку! Все, теперь можешь активизировать тот или другой проект в окне Project Manager или в выпадающем списке рядом с кнопкой Run, и запустить их.
Но я сразу не обратил внимания, что у тебя написано:
> то в памяти создаётся другая копия сервера, а запущенная под средой не принимает запросы от клиента.
Это странно. У тебя какой параметр instancing задан при создании фабрики?
Но вообще-то можно подключиться и к уже запущенному экземпляру - в меню Run->Attach to process. Тут, правда, не всегда удачно срабатывает, но тогда я включаю на вкладке линкера добавление TD32 info и remote symbols, плюс ставлю бряк на Begin в файле проекта, тогда нормально работает.
PS Зря ты в потрепаться это задал - я сюда редко захожу, а остальные что-то не хотят учавствовать:(( Да и не очень подходит сюда тема.
← →
Сатир (2005-12-26 19:07) [8]
> Создаешь группу проектов - Project Group в репозитарии,
> включаешь в нее оба проекта, собираешь оба с включением
> отладочной информации, далее делаешь Compile All - именно
> компиляцию, не сборку!
группа проектов уже была созданна и в неё было включено оба проекта.
Открыл эту группу.
Нажал Compile All. Выбрал проект клиента, нажал Run. Но бряк в коде сервера не сработал, в памяти создалась другая копия сервера.
> Это странно. У тебя какой параметр instancing задан при
> создании фабрики?
Модель скорее всего однопоточная, потому что для каждой копии клиента создается отдельная копия сервера.
> PS Зря ты в потрепаться это задал - я сюда редко захожу,
> а остальные что-то не хотят учавствовать:(( Да и не очень
> подходит сюда тема.
Задал в "Потрепаться" - думал, здесь народу больше бывает.
Если модеру угодно, пусть перенесут в COM/DCOM/COM+
← →
Набережных С. © (2005-12-26 19:17) [9]
> Сатир (26.12.05 19:07) [8]
:)) Так ты сначала запусти сервер, потом клиента, потом опять переключись на сервер, а уже после этого подключайся клиентом к серверу. Ну или через Attach to process, если почему-либо не устраивает.
← →
Набережных С. © (2005-12-26 19:25) [10]
> Модель скорее всего однопоточная,
Не, я не про потоковую модуль, я про ciSingleInstance или ciMultiInstance. Хотя, первый клиент все-равно должен бы подключиться к уже запущенному экземпляру сервера, если не путаю по забывчивости, совсем плохая память стала:((, а SingleInstance давно не использовал.
← →
Сатир (2005-12-27 14:31) [11]
> Так ты сначала запусти сервер, потом клиента, потом опять
> переключись на сервер, а уже после этого подключайся клиентом
> к серверу.
запустил сервер. переключился на клиента. запустил клиент, в памяти поднялась другая копия сервера. даже в трее создаётся значёк сервера, и когда на него наводишь мышкой, в хинте показывает имя пользователя.
так вот, после запуска клиента у меня в трее два значка серверов. первый запущенный под средой без пользователей. втрой, поднятый клиентом, тоже запущеным под средой. в результате, копия запущенная подстредой, запросы от клиента принимать не будет, потому то у клиента в памяти есть другая копия сервера.
> я про ciSingleInstance или ciMultiInstance.
а где в исходниках можно посмотреть, какая модель у сервера? Но судя по поведению сервера - ciMultiInstance.
← →
Сатир (2005-12-27 14:37) [12]Полистал на выходных книжку Delphi и СОМ Тенцера. Ну хоть бы одну главу посвятили отладке. Ан-нет, об этом ни слова....
← →
Набережных С. © (2005-12-27 17:14) [13]
> а где в исходниках можно посмотреть, какая модель у сервера?
> Но судя по поведению сервера - ciMultiInstance.
Это один из флагов, передаваемых параметром в конструктор фабрики классов. Если СОМ-объект создавался мастером, то в секции инициализации модуля с декларацией СОМ-класса есть код создания фабрики для него. Вот там и указывается.
MultiInstance означает, что для всех клиентов будет использоваться один процесс сервера, и в нем будет создаваться необходимое число СОМ-объектов, по одному на каждого клиента.
SingleInstance означает, что для каждого клиента будет запускаться отдельный процесс сервера и в нем будет создаваться один экземпляр объекта.
Это довольно грубое описание, но достаточно близкое к истине, в большинстве случаев этого достаточно.
Но даже если у тебя стоит SingleInstance, то все равно, первый клиент должен подключаться к уже запущенному процессу, а вот для последующих должен запускаться отдельный сервер. У тебя что-то непонятное. Если у тебя SingleInstance, то могу предположить два варианта: первый запущенный процесс при попытке создать в нем объект почему-то возвращает ошибку, либо клиент в процессе запуска несколько раз подключается - отключается. В результате он первый раз подключается к уже запущенному серверу, потом отключается, а когда снова пытается подключиться, то СОМ, естественно, создает для него новый серверный процесс, так как первый запущенный уже "израсходован". Других объяснений описанной тобой ситуации мне что-то в голову не приходит. Правда, тут еще BSS может вносить свое, попробуй через DCOMConnection.
← →
Карелин Артем © (2005-12-27 17:32) [14]А в чем проблема-то? Запускаем две дельфины. Из одной клиента отлаживаем, из другой сервер. Вполне нормально отлаживается и через BSS.
← →
Набережных С. © (2005-12-27 17:48) [15]
> Карелин Артем © (27.12.05 17:32) [14]
Да не нужны они в большинстве случаев, две дельфи-то, удобней в одной. У меня вот и так все нормально отлаживается, и через BSS тоже, и подобных проблем не бывает. Кроме того, всегда можно воспользоваться Attach to process, получим то же самое. Но описанная у него ситуация, боюсь, повторится и с двумя Delphi, потому как дело тут на 99.9% не в отладчике, а в коде.
← →
Сатир (2005-12-27 19:00) [16]
> попробуй через DCOMConnection
нет уж, этого пока пробовать не буду. Проект полностью рабочий. Отдали мне на время исправлять мелкие недоработки. Так вроде пока в основном все ошибки только в клиенте и его можно свободно отлаживать.
А в сервере самого кода немного. В основном запросы к оракловской базе через Query.
Так что большой необходимости его отлаживать нету. Просто хотелось для сноровки пройтись отладчиком по всему серверу, посмотреть как он работает. Ладно, попробую в очередной раз вызвонить разработчика и распросить у него секрет отладки сервера.
← →
Сатир (2005-12-27 19:05) [17]может этот кусок сможет пролить на что-то свет
initialization
TComponentFactory.Create(ComServer, TRefusSvr,
Class_RefusSvr, ciSingleInstance, tmApartment);
end.
← →
Набережных С. © (2005-12-27 19:41) [18]
> Сатир (27.12.05 19:00) [16]
>
> > попробуй через DCOMConnection
Там, [13], вообще-то не только это было написано, как можно заметить, если его внимательно прочитать. В том числе и про это:
> TComponentFactory.Create(ComServer, TRefusSvr,
> Class_RefusSvr, ciSingleInstance, tmApartment);
А про DCOMConnection - это так, попутное замечание. А вообще-то, ciSingleInstance - довольно специфичный режим, нужный в относительно редких, особых случаях.
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2006.01.22;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.038 c