Несовместимость между Indy 9 и Windows Server 2003?

У меня проблема с приложением Delphi на некоторых серверах Windows 2003. Он использует вызов веб-службы для соединения с другим сервером и передачи данных туда и обратно. Как только приложение попадает в метод Authenticate, оно умирает. Приложение годами работало на предыдущих компьютерах с Win Server 2003, но не на недавно собранных машинах. Машины по большей части настроены одинаково, но есть некоторые настройки, которые я не могу отследить. Кроме того, хотя ошибка становится очевидной при обращении к Authenticate, перехват пакетов доказывает, что между приложением и сервером, с которым оно пытается установить связь, ничего не происходит, что усиливает мои мысли о том, что что-то умирает на раннем этапе при настройке соединения. Я не могу продублировать ошибку локально, поэтому я не могу просмотреть приложение в отладчике. Любые мысли о том, почему веб-соединение Indy 9 Delphi может молча провалиться?

2 ответа

Решение

Вот где он взрывался:

MySoapObject := GetNewSoapObject(usewsdl, addr, FHTTPRIO);  
 ...   
if MySoapObject <> nil then   
  MySoapObject.SomeFunction(); // BOOM! Access Violation here.

Решение найдено! Оказалось, что это DEP (предотвращение выполнения данных). Когда я пересобрал наш код с помощью мыльных библиотек Delphi2007, проблема исчезла. Так как я не хотел этого делать (десериализация вызывала проблемы, из-за которых сервер задыхался в нашем XML), и мой mgr действительно не хотел этого делать (включал обширное регрессионное тестирование), я искал различия между SOAP исходный код между D2005 и D2007, с целью внесения целенаправленных изменений в то, что отличалось между ними. т.е. найти разницу, которая имеет значение. Beyond Compare был моим приятелем здесь. Один вид изменений выделяется как странный - RIO.PAS теперь включает в себя новый модуль PrivateHeap.pas. Удивляясь, почему, я погуглил и нашел похожую проблему с объяснением, которое, казалось, было правильным для цели.

Проблема DEP заключается в том, что начиная с Windows XP с пакетом обновления 2 (SP2), если ваше оборудование способно, Windows будет препятствовать выполнению кода из неисполняемой памяти. К сожалению, среда выполнения Delphi SOAP создает кучу блоков, и выделенная для них память не была помечена как исполняемая. Поэтому, когда обновление ОС было выпущено на подходящем оборудовании, вы получите AV при вызове метода, поддерживаемого компонентом RIO. Эта проблема была решена в обновлении с модулем PrivateHeap.
- Жан-Мари Бабе
http://delphigroups.info/2/11/344230.html

Бинго! Теперь вот где это становится сложным. DEP всегда был включен на наших серверах. Сначала это казалось маловероятным. Но DEP сложен, и новое оборудование более способно, чем старое. Так что я думаю, что в прошлом у нас не было проблем с DEP, и теперь новое оборудование сбивает нас с толку. Администратор нашего сервера отключил защиту DEP (для сторонних приложений), перезагрузился, и наш старый код сработал! Хотя мы в конечном итоге перейдем к новым библиотекам, это будет для нас отличным краткосрочным решением, поскольку оно позволит нам избежать необходимости регрессионного тестирования этого приложения, которое в противном случае работает нормально.

Итак, подведем итог: наше приложение Delphi2005 зависало на недавно построенных серверах Windows2003 из-за предотвращения выполнения данных (DEP), мешающего созданию объекта HTTPRIO. РИО будет создан без исключения, представляется действительным. Но когда использовался связанный объект IInvokable, он выдавал бы нарушение доступа, прежде чем пытаться связываться по проводам вообще. Престижность нашим кооперативным и очень терпеливым администраторам, коллегам по разработке Mcmar, Beyond Compare и Жан-Мари Бабе.

Может ли это быть Брандмауэр, вызывающий проблемы в 2003 году?

Другие вопросы по тегам