Извиняюсь аз повтор, однако при обсуждении в прошлый раз этой темы не были затронуты след. вопросы:
Почему при попытке отладки COM-объекта. созданного в модели Both ни при каких вариантах точка прерывания в коде не устанавливается, а в Apartment — устанавливается со свистом, и отладка происходит, как это описано в соответствующей статье в MSDN.
Условия: Win2k, VC++ 6.0 SP 5, IIS 5.0
Пока удается отлаживать только с помощью создания объекта-двойника в модели Apartment, и отлаживать. Очень неудобно. Буду очень признателен за помощь.
Здравствуйте Kaa, Вы писали:
Kaa>Извиняюсь аз повтор, однако при обсуждении в прошлый раз этой темы не были затронуты след. вопросы:
Kaa>Почему при попытке отладки COM-объекта. созданного в модели Both ни при каких вариантах точка прерывания в коде не устанавливается, а в Apartment — устанавливается со свистом, и отладка происходит, как это описано в соответствующей статье в MSDN.
Kaa>Условия: Win2k, VC++ 6.0 SP 5, IIS 5.0
Kaa>Пока удается отлаживать только с помощью создания объекта-двойника в модели Apartment, и отлаживать. Очень неудобно. Буду очень признателен за помощь.
Вообще-то должно работать, но если уж совсем не получается всегда можно в код ASSERT или int 3; влепить.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте VladD2, Вы писали:
>Вообще-то должно работать, но если уж совсем не получается всегда можно в код ASSERT или int 3; влепить.
При вставке _ASSERT( 0 ) никаких шевелений не происходит:
Вызов метода объекта никогда не завершается, отладчик никак не реагирует.
Алексей Кирдин
Re[3]: Отладка COM под ASP
От:
Аноним
Дата:
05.10.01 15:32
Оценка:
Здравствуйте kaa, Вы писали:
kaa>Здравствуйте VladD2, Вы писали:
>>Вообще-то должно работать, но если уж совсем не получается всегда можно в код ASSERT или int 3; влепить.
kaa>При вставке _ASSERT( 0 ) никаких шевелений не происходит: kaa>Вызов метода объекта никогда не завершается, отладчик никак не реагирует.
Похоже следующая ситуация:
Объект с Apartment поднимается в IIS In-Process COM+ app, который запускается под Interactive User, то есть ты и брейкпоинт поставишь и мессаджбокс от ассершина увидишь.
А объект с Both стартует в IIS Out of proccess COM+ app, у которого по дефолту свой юзер (не помню точно — по-моему, IWAM_имямашины) —
следовательно мессадж бокс от ассершина ты уж точно не увидишь и метод с ассершином будет длится вечно в ожидании, пока IWAM_имямашины не нажмет кнопку в мессадж боксе... :)
Короче, попробуй поставить у IIS Out of proccess COM+ app Identity тоже Interactive User
Здравствуйте Аноним, Вы писали:
А>Короче, попробуй поставить у IIS Out of proccess COM+ app Identity тоже Interactive User
Поставил. Эффект следующий: присоединяюсь к соответствующему dllhost.exe отладчиком, и вижу следующее: в методах самого COM-объекта он мне по-прежнему не дает ставить точки прерывания, а вот в текстах библиотеки (статически прилинкованной) точки ставятся, и в них он останавливается. Это уже положительный эффект, но вся синхронизация у меня в самом COM-объекте, поэтому хотелось бы и до него добраться. Пока это не удалось.
Кстати, поменять обратно пользователя с Interactive User на IWAM_имямашины не удается, т.к. нет такого пользователя. Где его взять? Хочется попробовать ставить точки там, где они ставятся теперь, и до текущего изменения.
Здравствуйте Аноним, Вы писали:
А>Похоже следующая ситуация: А>Объект с Apartment поднимается в IIS In-Process COM+ app, который запускается под Interactive User, то есть ты и брейкпоинт поставишь и мессаджбокс от ассершина увидишь. А>А объект с Both стартует в IIS Out of proccess COM+ app, у которого по дефолту свой юзер (не помню точно — по-моему, IWAM_имямашины) — А>следовательно мессадж бокс от ассершина ты уж точно не увидишь и метод с ассершином будет длится вечно в ожидании, пока IWAM_имямашины не нажмет кнопку в мессадж боксе... :)
Чушь какая-то. Объект в ASP (если он не принадлежит отдельному COM+ серверному приложению) всегда создается в том же контексте, в котором работает веб-приложение (будь-то in-proc, pooled или isolated).
Для pooled существует всего один COM+ пул для всех приложений, для isolated создается отдельное COM+-приложение. По умолчанию они все работают под IWAM_MACHINENAME (и никогда под interactive user).
А>Короче, попробуй поставить у IIS Out of proccess COM+ app Identity тоже Interactive User
Самый простой способ — поставить веб приложение в In-Proc и отлаживать сам сервис inetinfo. Еще ни разу не видел, чтобы это не срабатывало.
Самый крайний случай — поставить SoftIce и отлаживать им.
Здравствуйте Lexey, Вы писали:
L>Здравствуйте Аноним, Вы писали:
L>Самый простой способ — поставить веб приложение в In-Proc и отлаживать сам сервис inetinfo. Еще ни разу не видел, чтобы это не срабатывало.
Это тоже не удается. Точки прерывания не ставятся, все точно как в предыдущем описании, только что процесс другой. Да и в прилинкованных библиотеках точки ставиться перестали. Непонятная ситуация, короче.
Здравствуйте Kaa, Вы писали:
Kaa>Здравствуйте Lexey, Вы писали:
L>>Здравствуйте Аноним, Вы писали:
L>>Самый простой способ — поставить веб приложение в In-Proc и отлаживать сам сервис inetinfo. Еще ни разу не видел, чтобы это не срабатывало.
Kaa>Это тоже не удается. Точки прерывания не ставятся, все точно как в предыдущем описании, только что процесс другой. Да и в прилинкованных библиотеках точки ставиться перестали. Непонятная ситуация, короче.
Как отлаживаешь-то?
По шагам:
1) Attach to process... inetinfo
2) В Project->Settings->Debug->Additioal DLLs добавляешь все свои библиотеки.
3) Открываешь исходники (не Open workspace, а Open File для каждого исходника).
4) Ставишь точки останова.
5) Отлаживаешься.
Здравствуйте Lexey, Вы писали: L>Как отлаживаешь-то? L>5) Отлаживаешься.
— До этого пункта все как по нотам ;-)) А дальше все не как у людей. Я тут всех знакомых уже задолбал этим вопросом, но никто еще на наших (у нас на 3-х компах та же ситуация) выполнить ЭТО не сумел еще ;-)) Хотя VS у нас лицензионный со всеми сервиспаками (SP 5) и Platform SDK. Одним словом — чудеса.
Здравствуйте Lexey, Вы писали: L>Гхм, а сам COM-объект у тебя что — не в DLL?
Возможно я неправильно выразился. Объясню ситуацию:
Объект представляет из себя оболочку для некоторого движка, вся логика которого находится в статически прилинкованной либе. В исходниках этой либы точки прерывания ставятся со свистом.
Сам COM-объект — я подразумевал код методов C++-класса, реализующего COM-интерфейс, экземпляр которого создается при запросе интерфейса клиентом. Код этого класса содержится в 2-х определенных файлах: ...h и ...cpp. Так вот, в этих 2-х файлах точки прерывания не ставятся.
Здравствуйте Kaa, Вы писали:
Kaa>Здравствуйте Lexey, Вы писали: L>>Гхм, а сам COM-объект у тебя что — не в DLL?
Kaa>Возможно я неправильно выразился. Объясню ситуацию: Kaa>Объект представляет из себя оболочку для некоторого движка, вся логика которого находится в статически прилинкованной либе. В исходниках этой либы точки прерывания ставятся со свистом.
Kaa>Сам COM-объект — я подразумевал код методов C++-класса, реализующего COM-интерфейс, экземпляр которого создается при запросе интерфейса клиентом. Код этого класса содержится в 2-х определенных файлах: ...h и ...cpp. Так вот, в этих 2-х файлах точки прерывания не ставятся.
Kaa>Вот что я имел в виду. Надеюсь, прояснил.
Угу. Тогда действительно чудеса, да и только. 8-( ).
Знаешь что, попробуй еще int3 жестко в код включить.
Что-то типа: