Проблемы с FreeUDFLib на Windows XP

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
Dwarrior
Сообщения: 6
Зарегистрирован: 15 июн 2010, 17:14

Проблемы с FreeUDFLib на Windows XP

Сообщение Dwarrior » 16 июн 2010, 07:44

Доброе время суток!
Стоял Interbase 5.6 с подключенным FreeUDFLib.dll, дельфевая задача. ОС была какая-то Windows XP (предположительно до SP2).
В один прекрасный день винда накрылась. Поставили Windows XP SP2 (может SP3), все восстановили назад и теперь вот какая проблема - при выполнении запроса, который использует функции f_Mid и f_lrtrim из библиотеки FreeUDFLib периодически вываливаются ошибки. Причем тенденция такая - перегружаем комп, выполняем запрос - нормально. Еще пару раз выполняем - все, ошибка. и до перегрузки не исправляется. Тот же запрос, но выполненный через IBExpert работает стабильнее, т.е. ошибка вываливается гораздо позднее, чем из дельфевой задачи.
Текст ошибки:
General SQL Error.
A fatal exception occurred during the execution of a user defined function.
A fatal exception occurred during the execution of a user defined function.
A fatal exception occurred during the execution of a user defined function.
Access violation. The code attempted to access a virtual address without privilege to do so.

Текст запроса:
SELECT ID,ACTUALDATE,IDCL,CLNAME,NEXTDATE
FROM PL_ALLCLIENTS
ORDER BY CLTYPE ASC , CLNAME
где

CREATE VIEW PL_ALLCLIENTS(
ID,
ACTUALDATE,
IDCL,
CLTYPE,
CLTYPENAME,
CLCODE,
CLNAME,
CLSHNAME,
.....
NEXTDATE)
AS
select
c.id,c.actualdate,c.idcl,c.cltype,ct.name,
cast(F_Mid(F_LRTrim(c.okpo)||F_LRTrim(F_LRTrim(c.mandser)||" "||F_LRTrim(c.mandnum)),0,249) as char(250)),
cast(F_Mid(F_LRTrim(c.fullname)||F_LRTrim(F_LRTrim(c.manlname)||" "||F_LRTrim(c.manfname)||" "||F_LRTrim(c.manmname)),0,249) as char(250)),
cast(F_Mid(F_LRTrim(c.shortname)||F_LRTrim(F_LRTrim(c.manlname)||" "||F_LRTrim(c.manfname)||" "||F_LRTrim(c.manmname)),0,249) as char(250)),
c.rnn, ...,c.nextdate
from pl_clients c
left join pl_cltypes ct on ct.id=c.cltype
left join pl_countries cn on cn.id=c.country
left join pl_regions r on r.id=c.region
left join pl_districts d on d.id=c.district
left join pl_compscats cs on cs.id=c.category
left join pl_currencies cr on cr.id=c.currency
left join pl_docstypes dt on dt.id=c.mandtype
;
опытным путем установлено, что ошибка начинается, когда добавляем clname (выделено жирным, вычисляемое поле с использованием функций F_Mid, F_LRTrim) в условия сортировки.

Вопрос - почему вываливается ошибка и что надо исправить? На предыдущей винде (да и на пре-предыдущей Windows 2000 Server) все работало как часы. Пока винду не перебивали - брал бэкап этой базы, разворачивал у себя на WinXPSP2 - такая же проблема, но тогда не сильно беспокоило, т.к. рабочая база была в строю. Сейчас путей назад уже нет:) Помогите пожста, кто чем может? :)

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Re: Проблемы с FreeUDFLib на Windows XP

Сообщение hvlad » 16 июн 2010, 09:48

Бага в FreeUDFLib. Отладчик в руки - и вперёд

Dwarrior
Сообщения: 6
Зарегистрирован: 15 июн 2010, 17:14

Re: Проблемы с FreeUDFLib на Windows XP

Сообщение Dwarrior » 16 июн 2010, 10:05

хм....даже учитывая тот факт, что на предыдущей оси с этой dll все работало? И тот факт, что FreeUDFLib широко известна и поставляется скомпилированной dll и предполагается, что там все функции отлажены донельзя?

Факты говорят о том, что проблема похоже с памятью что ли. Потому что первый разы запрос выполняется, а потом уже нет. FreeIt стоит и всегда стояла. Может что-то не так в работе Interbase 5.6 под Windows XP SP2?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: Проблемы с FreeUDFLib на Windows XP

Сообщение kdv » 16 июн 2010, 10:51

скорее всего проблема в комбинации freeudflib и ib_util.dll.
читать тут
http://www.ibase.ru/ibfaq.htm#free_it

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

Dwarrior
Сообщения: 6
Зарегистрирован: 15 июн 2010, 17:14

Re: Проблемы с FreeUDFLib на Windows XP

Сообщение Dwarrior » 29 июн 2010, 13:15

Что такое "рантайм ms"?:)

Поставил ради интереса Windows 2000 Prof SP4 - та же ошибка.
Версий FreeUDFLib две - 1999 и 2003 г.в. Всегда использовал только 1999.

Есть у кого-нить еще мысли кроме как написать свою UDF с такими же функциями?:)

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Re: Проблемы с FreeUDFLib на Windows XP

Сообщение Dimitry Sibiryakov » 29 июн 2010, 14:29

Dwarrior писал(а):Что такое "рантайм ms"?:)
MSVC RTL.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: Проблемы с FreeUDFLib на Windows XP

Сообщение kdv » 29 июн 2010, 14:32

Что такое "рантайм ms"?:)
msvc*.dll

должны соответствовать версии компилятора, которым компилируется FB (под Windows. На Lunux там libc).
Одна из используемых сервером функций рантайма - это аллокирование памяти. Если рантайм "не тот", возможны глюки и падения сервера.
Udf это dll, загружаемая в адресное пространство сервера. Если в udf используется FREE_IT, это означает, что память аллокируется в функции, а освобождается сервером. То есть, функции аллокирования и освобождения должны выполняться ОДНИМ рантаймом.
ib_util.dll предназначена для того, чтобы унифицировать вызов аллокирования памяти. Если эта dll не от того сервера, или рядом лежит не тот рантайм, и т.д., то см. выше - возможны глюки или падения сервера.

Все же в FAQ расписано, разве нет?
Версий FreeUDFLib две - 1999 и 2003 г.в. Всегда использовал только 1999.
ну вот и вопрос - в версии 1999 года что там совместно с FREE_IT используется?

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Re: Проблемы с FreeUDFLib на Windows XP

Сообщение hvlad » 29 июн 2010, 15:09

Dwarrior писал(а):Есть у кого-нить еще мысли кроме как написать свою UDF с такими же функциями?:)
Прочитать уже данный ответ ?

Dwarrior
Сообщения: 6
Зарегистрирован: 15 июн 2010, 17:14

Re: Проблемы с FreeUDFLib на Windows XP

Сообщение Dwarrior » 29 июн 2010, 16:05

Дык вся загвоздка в том, что на 99,99% и ib_util.dll и FreeUDFLib.dll ТЕ ЖЕ, что и на старом сервере! Другим им просто неоткуда взяться, установка Interbse та же....

msvc*.dll - если это dll от Interbase - значит она такая же, как и на старом сервере (тот же дистрибутив). Если же виндовая - то я вот недавно ставил Windows 2000, причем ту же сборку, на которой это когда-то все работало....

Т.е. я клоню к тому, что все файлы ТЕ ЖЕ....

Если друних причин появления подобной ошибки быть не может, тогда решение ясно - писать свою UDF, поскольку все комбинации наборов dll не помогают:)
Спасибо всем за обсуждение!

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: Проблемы с FreeUDFLib на Windows XP

Сообщение kdv » 29 июн 2010, 20:11

Дык вся загвоздка в том, что на 99,99% и ib_util.dll и FreeUDFLib.dll ТЕ ЖЕ, что и на старом сервере! Другим им просто неоткуда взяться, установка Interbse та же....
ок. а msvc*.dll - те же, точная дата, версия? Речь-то про них. ib_util.dll - это просто редиректор.
Т.е. я клоню к тому, что все файлы ТЕ ЖЕ....
клонить не надо. надо убедиться, те же или все таки чуть другие. По крайней мере msvcrt.dll от 6-го рантайма разных версий было дохренища. И одной из этих версий, например, установка IB 6 убивала уже установленный на компе какой-то MS SQL. Всего-лишь, принудительно запихивала более старую версию msvcrt.dll, чем уже была на компе и была нужна MS SQL.
В старых виндах, типа 2000, там при установке вообще рантайма могло не быть, его надо было ставить отдельно (или все "начинало работать" после установки MS Office). А рантайм ms содержат только последние версии FB 2.x, т.к. там уже система проверки рантаймов иная. Да и нынешние ОС делают это по другому.

Блин, вот не хватало еще всю эту фигню объяснять... Причин твоих проблем может быть всего три:
- кривая память, но ты ее вроде проверял
- кривая udf. часто бывает, что на одном сервере udf "работает", а на другом начинает сбоить.
- кривой рантайм ms.

Все. Выясняй по очереди реальную проблему.

Dwarrior
Сообщения: 6
Зарегистрирован: 15 июн 2010, 17:14

Re: Проблемы с FreeUDFLib на Windows XP

Сообщение Dwarrior » 30 июн 2010, 07:07

Еще раз спасибо всем, уважаемые!

kdv и все остальные - не серчайте на меня :) . Просто я разозлился на себя - "как так, дистрибутивы те же, ОС та же, а не работает". Вот и писал так отчаянно:)

Dwarrior
Сообщения: 6
Зарегистрирован: 15 июн 2010, 17:14

Re: Проблемы с FreeUDFLib на Windows XP

Сообщение Dwarrior » 01 июл 2010, 07:09

Найдено решение, если кому интересно...

Скачал исходники FreeUDFLib с ibase.ru, поставил Delphi, кинул в каталог с исходниками ib_util.dll и скомпилировал dll заново. Эта версия FreeUDFLib заработала:)
Как верно заметили гуру раздела - дело было в разных версиях рантайма. За это им еще раз большое спасибо!

Ответить