powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Firebird 3.0.1 SuperClassic периодически падает на UDF, Classic работает без проблем
22 сообщений из 22, страница 1 из 1
Firebird 3.0.1 SuperClassic периодически падает на UDF, Classic работает без проблем
    #39342267
Здравствуйте.

Обновил на сервере Firebird 2.5 64 бит на Firebird 3.0.1 64 бит
Базу перебэкапил, перекомпилировал все триггеры и процедуры.
Работает около 100 коннектов.

SuperClassic падает 1-2 раза в день с сообщением:

SRV-DELFIN Tue Oct 25 17:24:03 2016
The user defined function: UDF_POS
referencing entrypoint: dfudf_Pos
in module: tbudf
caused the fatal exception: Access violation.
The code attempted to access a virtual
address without privilege to do so.
This exception will cause the Firebird server
to terminate abnormally.


SRV-DELFIN Tue Oct 25 17:24:03 2016
The user defined function: UDF_POS
referencing entrypoint: dfudf_Pos
in module: tbudf
caused the fatal exception: Access violation.
The code attempted to access a virtual
address without privilege to do so.
This exception will cause the Firebird server
to terminate abnormally.

---------------------
SRV-DELFIN Fri Oct 28 08:59:28 2016
The user defined function: UDF_FORMATFLOAT
referencing entrypoint: dfudf_FormatFloat
in module: tbudf
caused the fatal exception: Access violation.
The code attempted to access a virtual
address without privilege to do so.
This exception will cause the Firebird server
to terminate abnormally.


SRV-DELFIN Fri Oct 28 08:59:28 2016
The user defined function: UDF_FORMATFLOAT
referencing entrypoint: dfudf_FormatFloat
in module: tbudf
caused the fatal exception: Access violation.
The code attempted to access a virtual
address without privilege to do so.
This exception will cause the Firebird server
to terminate abnormally.

Поменял архитектуру на Classic - все работает нормально уже неделю

В чем может быть причина?
...
Рейтинг: 0 / 0
Firebird 3.0.1 SuperClassic периодически падает на UDF, Classic работает без проблем
    #39342280
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вадим МещеряковВ чем может быть причина?В кривой UDF
...
Рейтинг: 0 / 0
Firebird 3.0.1 SuperClassic периодически падает на UDF, Classic работает без проблем
    #39342281
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вадим МещеряковSuperClassic падает 1-2 раза в день с сообщением:
udf кривые - это понятно. А вот зачем на 3.0 использовать SuperClassic? Никакого же смысла нет. Используй суперсервер.
...
Рейтинг: 0 / 0
Firebird 3.0.1 SuperClassic периодически падает на UDF, Classic работает без проблем
    #39342285
1. UDF в 2.5 работала много лет на всех вариантов архитектуры сервера, ошибки не было.
2. На 3.0.1 Classic работает
3. udf_pos, наверно, самая простая из наших udf

Вот так объявлена

DECLARE EXTERNAL FUNCTION UDF_POS
CSTRING(254),
CSTRING(254)
RETURNS INTEGER BY VALUE
ENTRY_POINT 'dfudf_Pos' MODULE_NAME 'tbudf';

Вот такой код проекта на Delphi XE 5

function dfudf_Pos(Sub, Str: PChar): integer; cdecl; export;
begin
Result := Pos(Sub, Str);
end;
...
Рейтинг: 0 / 0
Firebird 3.0.1 SuperClassic периодически падает на UDF, Classic работает без проблем
    #39342286
>Никакого же смысла нет. Используй суперсервер.
Для этого и затеяли обновление, но так как до этого работал 2.5 суперклассик, я решил менять все постепенно.
После обновления сервера на 3.0.1, пользователи стали жаловаться на разрыв коннекта.
Решил попробовать временно на классик (так как он не всех отключает при возникновении) что бы иметь время решить проблему не откатываясь на 2.5. Оказалось что на классик работает без ошибок.
...
Рейтинг: 0 / 0
Firebird 3.0.1 SuperClassic периодически падает на UDF, Classic работает без проблем
    #39342288
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вадим МещеряковUDF в 2.5 работала много лет на всех вариантов архитектуры сервера, ошибки не было.Это вообще не аргумент. В firebird.log -аргумент

Вадим МещеряковВот такой код проекта на Delphi XE 5IsMutlithreaded := true
ы ?
...
Рейтинг: 0 / 0
Firebird 3.0.1 SuperClassic периодически падает на UDF, Classic работает без проблем
    #39342289
udf кривые - это понятно.
А где можно найти информацию о том как правильно разрабатывать UDF для Firebird 3?
Мы много лет назад сделали собственную dll по примеру проекта TBUDF с http://www.ibase.ru/d_udf/
Для Linux собирали на FreePascal для Win на Delphi
...
Рейтинг: 0 / 0
Firebird 3.0.1 SuperClassic периодически падает на UDF, Classic работает без проблем
    #39342290
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вадим МещеряковВот такой код проекта на Delphi XE 5

function dfudf_Pos(Sub, Str: PChar): integer; cdecl; export;
begin
Result := Pos(Sub, Str);
end;Это не полный код проекта. Полный начинается с "library" и заканчивается "end.".
Про IsMultiThreaded hvlad уже написал. Именно из-за этого на CS работает, а на SC нет. А на SS было бы еще хуже.
...
Рейтинг: 0 / 0
Firebird 3.0.1 SuperClassic периодически падает на UDF, Classic работает без проблем
    #39342291
Это вообще не аргумент. В firebird.log -аргумент
Есть firebird.log за 1.5 года, там нет ни одной ошибки с udf и больше года нет с "terminated abnormally"
...
Рейтинг: 0 / 0
Firebird 3.0.1 SuperClassic периодически падает на UDF, Classic работает без проблем
    #39342293
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вадим Мещеряковudf кривые - это понятно.
А где можно найти информацию о том как правильно разрабатывать UDF для Firebird 3?
Мы много лет назад сделали собственную dll по примеру проекта TBUDF с http://www.ibase.ru/d_udf/
Для Linux собирали на FreePascal для Win на Delphi
Там же, где и для всех предыдущих версий. В тройке поддержка udf осталась для совместимости. Осталась нетронутой.

По поводу того, что на предыдущих версиях работало на всех архитектурах, у меня такие аргументы:
1. Я не очень верю в это;
2. Случайно везло.
...
Рейтинг: 0 / 0
Firebird 3.0.1 SuperClassic периодически падает на UDF, Classic работает без проблем
    #39342296
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вадим МещеряковВот такой код проекта на Delphi XE 5

Код: pascal
1.
2.
3.
4.
function dfudf_Pos(Sub, Str: PChar): integer; cdecl; export;
begin
   Result := Pos(Sub, Str);
end;



Ужоснах. Дайте по башке тому безмозглому чудаку, который этот код портировал с древних версий.

Он вообще если и способен работать в ХЕ5, то только очень-очень сильным чудом. Потому что
PChar там это PWideChar, а Firebird передаёт строку обычных однобайтовых символов в
неизвестно какой кодировке (потому что при объявлении она не указана). В результате если в
переданном буфере нет двух-трёх нулей в конце, то неявное преобразование PWideChar в
WideString для скармливания функции Pos() в поисках терминатора выходит за пределы всех
мыслимых буферов, что и приводит к AV, наблюдаемому в логе.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Firebird 3.0.1 SuperClassic периодически падает на UDF, Classic работает без проблем
    #39342309
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вадим МещеряковА где можно найти информацию о том как правильно разрабатывать UDF для Firebird 3?
нет никакой разницы, для какой версии Firebird разрабатывать UDF.
Тут проблема в том, что Delphi XE5 - юникодная. А приведенный код явно перетащен с Delphi7-2007, т.е. неюникодных.
В общем, для win1251 я бы рекомендовал использовать неюникодные Дельфи. Для utf8 - юникодные.
пример юникодной udf есть в конце
http://www.ibase.ru/unicode_faq/

там же понятно, что для win1251 надо в качестве параметров в юникодной дельфе использовать PAnsiChar, а не PChar.
Ну и, если в базе и win1251 и utf8, то тогда у udf нужно явно задавать чарсет параметров. И если дельфя юникодная, так уж лучше и udf сразу писать юникодную, win1251 будет перекодироваться в utf8 и обратно без проблем.

p.s. поскольку у меня на сайте все функции старые, соответственно, они неюникодные, и дельфевые написаны на Дельфи 2007 и ниже. Единственный пример udf под юникодной Дельфи - выше по ссылке.
...
Рейтинг: 0 / 0
Firebird 3.0.1 SuperClassic периодически падает на UDF, Classic работает без проблем
    #39342346
Прошу прощения, не тот исходный код привел (а из старой dll собранной на Delphi 7)

В новой dll вот такой код

Код: pascal
1.
2.
3.
4.
function dfudf_Pos(Sub, Str: PAnsiChar): integer; cdecl; export;
begin
 Result := Pos(Sub, Str);
end;
...
Рейтинг: 0 / 0
Firebird 3.0.1 SuperClassic периодически падает на UDF, Classic работает без проблем
    #39342464
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вадим МещеряковПрошу прощения, не тот исходный код привел (а из старой dll собранной на Delphi 7)

В новой dll вот такой код

Код: pascal
1.
2.
3.
4.
function dfudf_Pos(Sub, Str: PAnsiChar): integer; cdecl; export;
begin
 Result := Pos(Sub, Str);
end;


В который раз. Выложи же уже полный текст проекта. А так же описание фции в базе. И дефолтный чарсет, с которым база создана.
...
Рейтинг: 0 / 0
Firebird 3.0.1 SuperClassic периодически падает на UDF, Classic работает без проблем
    #39342468
IsMultithreaded := true
А вот этого как раз и не было!!!!!
Спасибо за помощь.
Переделаем и проверим, теперь знаем как правильно теcтировать :)
...
Рейтинг: 0 / 0
Firebird 3.0.1 SuperClassic периодически падает на UDF, Classic работает без проблем
    #39342470
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вадим Мещеряков,

эта UDF не нужна, совсем. Уже много лет существует встроенная функция POSITION, которая избавляет от геморроя с различными кодировками и ограничениями. Для других, возможно нужных UDF нужно указать IsMutlithreaded := true
...
Рейтинг: 0 / 0
Firebird 3.0.1 SuperClassic периодически падает на UDF, Classic работает без проблем
    #39342475
kdvВ общем, для win1251 я бы рекомендовал использовать неюникодные Дельфи
Неюникодные Дельфи умеют собирать 64 битные dll?
...
Рейтинг: 0 / 0
Firebird 3.0.1 SuperClassic периодически падает на UDF, Classic работает без проблем
    #39342484
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вадим Мещеряков,

нет, конечно.
...
Рейтинг: 0 / 0
Firebird 3.0.1 SuperClassic периодически падает на UDF, Classic работает без проблем
    #39342499
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вадим МещеряковIsMultithreaded := true
А вот этого как раз и не было!!!!!

Вчера же ответили 2 раза.
...
Рейтинг: 0 / 0
Firebird 3.0.1 SuperClassic периодически падает на UDF, Classic работает без проблем
    #39342503
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вадим МещеряковВ новой dll вот такой код

Ненамного лучше. Не надо использовать Pos. Правильная функция это AnsiStrScan.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Firebird 3.0.1 SuperClassic периодически падает на UDF, Classic работает без проблем
    #39342507
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да и вообще, паскальные строки использовать в УДФ можно только чОтко представляя какая неонка у ея внутрях.
а лучше вообще не использовать.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Firebird 3.0.1 SuperClassic периодически падает на UDF, Classic работает без проблем
    #39342537
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вадим Мещеряков,

как я уже написал именно эта функция вообще не нужна.

Ты бы ревизию кода провёл и заменил UDF на их встроенные аналоги.
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Firebird 3.0.1 SuperClassic периодически падает на UDF, Classic работает без проблем
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]