Проблемы с FreeUDFLib на Windows XP
Проблемы с FreeUDFLib на Windows XP
Доброе время суток!
Стоял 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 - такая же проблема, но тогда не сильно беспокоило, т.к. рабочая база была в строю. Сейчас путей назад уже нет:) Помогите пожста, кто чем может?
Стоял 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 - такая же проблема, но тогда не сильно беспокоило, т.к. рабочая база была в строю. Сейчас путей назад уже нет:) Помогите пожста, кто чем может?
Re: Проблемы с FreeUDFLib на Windows XP
Бага в FreeUDFLib. Отладчик в руки - и вперёд
Re: Проблемы с FreeUDFLib на Windows XP
хм....даже учитывая тот факт, что на предыдущей оси с этой dll все работало? И тот факт, что FreeUDFLib широко известна и поставляется скомпилированной dll и предполагается, что там все функции отлажены донельзя?
Факты говорят о том, что проблема похоже с памятью что ли. Потому что первый разы запрос выполняется, а потом уже нет. FreeIt стоит и всегда стояла. Может что-то не так в работе Interbase 5.6 под Windows XP SP2?
Факты говорят о том, что проблема похоже с памятью что ли. Потому что первый разы запрос выполняется, а потом уже нет. FreeIt стоит и всегда стояла. Может что-то не так в работе Interbase 5.6 под Windows XP SP2?
Re: Проблемы с FreeUDFLib на Windows XP
скорее всего проблема в комбинации freeudflib и ib_util.dll.
читать тут
http://www.ibase.ru/ibfaq.htm#free_it
то есть, на старой винде был один рантайм ms, на новой - другой. какая версия freeudflib используется и что там внутри - х.з.
читать тут
http://www.ibase.ru/ibfaq.htm#free_it
то есть, на старой винде был один рантайм ms, на новой - другой. какая версия freeudflib используется и что там внутри - х.з.
Re: Проблемы с FreeUDFLib на Windows XP
Что такое "рантайм ms"?:)
Поставил ради интереса Windows 2000 Prof SP4 - та же ошибка.
Версий FreeUDFLib две - 1999 и 2003 г.в. Всегда использовал только 1999.
Есть у кого-нить еще мысли кроме как написать свою UDF с такими же функциями?:)
Поставил ради интереса Windows 2000 Prof SP4 - та же ошибка.
Версий FreeUDFLib две - 1999 и 2003 г.в. Всегда использовал только 1999.
Есть у кого-нить еще мысли кроме как написать свою UDF с такими же функциями?:)
-
- Заслуженный разработчик
- Сообщения: 1436
- Зарегистрирован: 15 сен 2005, 09:05
Re: Проблемы с FreeUDFLib на Windows XP
MSVC RTL.Dwarrior писал(а):Что такое "рантайм ms"?:)
Re: Проблемы с FreeUDFLib на Windows XP
msvc*.dllЧто такое "рантайм ms"?:)
должны соответствовать версии компилятора, которым компилируется FB (под Windows. На Lunux там libc).
Одна из используемых сервером функций рантайма - это аллокирование памяти. Если рантайм "не тот", возможны глюки и падения сервера.
Udf это dll, загружаемая в адресное пространство сервера. Если в udf используется FREE_IT, это означает, что память аллокируется в функции, а освобождается сервером. То есть, функции аллокирования и освобождения должны выполняться ОДНИМ рантаймом.
ib_util.dll предназначена для того, чтобы унифицировать вызов аллокирования памяти. Если эта dll не от того сервера, или рядом лежит не тот рантайм, и т.д., то см. выше - возможны глюки или падения сервера.
Все же в FAQ расписано, разве нет?
ну вот и вопрос - в версии 1999 года что там совместно с FREE_IT используется?Версий FreeUDFLib две - 1999 и 2003 г.в. Всегда использовал только 1999.
Re: Проблемы с FreeUDFLib на Windows XP
Прочитать уже данный ответ ?Dwarrior писал(а):Есть у кого-нить еще мысли кроме как написать свою UDF с такими же функциями?:)
Re: Проблемы с FreeUDFLib на Windows XP
Дык вся загвоздка в том, что на 99,99% и ib_util.dll и FreeUDFLib.dll ТЕ ЖЕ, что и на старом сервере! Другим им просто неоткуда взяться, установка Interbse та же....
msvc*.dll - если это dll от Interbase - значит она такая же, как и на старом сервере (тот же дистрибутив). Если же виндовая - то я вот недавно ставил Windows 2000, причем ту же сборку, на которой это когда-то все работало....
Т.е. я клоню к тому, что все файлы ТЕ ЖЕ....
Если друних причин появления подобной ошибки быть не может, тогда решение ясно - писать свою UDF, поскольку все комбинации наборов dll не помогают:)
Спасибо всем за обсуждение!
msvc*.dll - если это dll от Interbase - значит она такая же, как и на старом сервере (тот же дистрибутив). Если же виндовая - то я вот недавно ставил Windows 2000, причем ту же сборку, на которой это когда-то все работало....
Т.е. я клоню к тому, что все файлы ТЕ ЖЕ....
Если друних причин появления подобной ошибки быть не может, тогда решение ясно - писать свою UDF, поскольку все комбинации наборов dll не помогают:)
Спасибо всем за обсуждение!
Re: Проблемы с FreeUDFLib на Windows XP
ок. а msvc*.dll - те же, точная дата, версия? Речь-то про них. ib_util.dll - это просто редиректор.Дык вся загвоздка в том, что на 99,99% и ib_util.dll и FreeUDFLib.dll ТЕ ЖЕ, что и на старом сервере! Другим им просто неоткуда взяться, установка Interbse та же....
клонить не надо. надо убедиться, те же или все таки чуть другие. По крайней мере msvcrt.dll от 6-го рантайма разных версий было дохренища. И одной из этих версий, например, установка IB 6 убивала уже установленный на компе какой-то MS SQL. Всего-лишь, принудительно запихивала более старую версию msvcrt.dll, чем уже была на компе и была нужна MS SQL.Т.е. я клоню к тому, что все файлы ТЕ ЖЕ....
В старых виндах, типа 2000, там при установке вообще рантайма могло не быть, его надо было ставить отдельно (или все "начинало работать" после установки MS Office). А рантайм ms содержат только последние версии FB 2.x, т.к. там уже система проверки рантаймов иная. Да и нынешние ОС делают это по другому.
Блин, вот не хватало еще всю эту фигню объяснять... Причин твоих проблем может быть всего три:
- кривая память, но ты ее вроде проверял
- кривая udf. часто бывает, что на одном сервере udf "работает", а на другом начинает сбоить.
- кривой рантайм ms.
Все. Выясняй по очереди реальную проблему.
Re: Проблемы с FreeUDFLib на Windows XP
Еще раз спасибо всем, уважаемые!
kdv и все остальные - не серчайте на меня . Просто я разозлился на себя - "как так, дистрибутивы те же, ОС та же, а не работает". Вот и писал так отчаянно:)
kdv и все остальные - не серчайте на меня . Просто я разозлился на себя - "как так, дистрибутивы те же, ОС та же, а не работает". Вот и писал так отчаянно:)
Re: Проблемы с FreeUDFLib на Windows XP
Найдено решение, если кому интересно...
Скачал исходники FreeUDFLib с ibase.ru, поставил Delphi, кинул в каталог с исходниками ib_util.dll и скомпилировал dll заново. Эта версия FreeUDFLib заработала:)
Как верно заметили гуру раздела - дело было в разных версиях рантайма. За это им еще раз большое спасибо!
Скачал исходники FreeUDFLib с ibase.ru, поставил Delphi, кинул в каталог с исходниками ib_util.dll и скомпилировал dll заново. Эта версия FreeUDFLib заработала:)
Как верно заметили гуру раздела - дело было в разных версиях рантайма. За это им еще раз большое спасибо!