Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Firebird 3.0.1 SuperClassic периодически падает на UDF, Classic работает без проблем / 22 сообщений из 22, страница 1 из 1
06.11.2016, 23:40
    #39342267
Firebird 3.0.1 SuperClassic периодически падает на UDF, Classic работает без проблем
Здравствуйте.

Обновил на сервере 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
07.11.2016, 00:04
    #39342280
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 3.0.1 SuperClassic периодически падает на UDF, Classic работает без проблем
Вадим МещеряковВ чем может быть причина?В кривой UDF
...
Рейтинг: 0 / 0
07.11.2016, 00:07
    #39342281
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 3.0.1 SuperClassic периодически падает на UDF, Classic работает без проблем
Вадим МещеряковSuperClassic падает 1-2 раза в день с сообщением:
udf кривые - это понятно. А вот зачем на 3.0 использовать SuperClassic? Никакого же смысла нет. Используй суперсервер.
...
Рейтинг: 0 / 0
07.11.2016, 00:21
    #39342285
Firebird 3.0.1 SuperClassic периодически падает на UDF, Classic работает без проблем
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
07.11.2016, 00:29
    #39342286
Firebird 3.0.1 SuperClassic периодически падает на UDF, Classic работает без проблем
>Никакого же смысла нет. Используй суперсервер.
Для этого и затеяли обновление, но так как до этого работал 2.5 суперклассик, я решил менять все постепенно.
После обновления сервера на 3.0.1, пользователи стали жаловаться на разрыв коннекта.
Решил попробовать временно на классик (так как он не всех отключает при возникновении) что бы иметь время решить проблему не откатываясь на 2.5. Оказалось что на классик работает без ошибок.
...
Рейтинг: 0 / 0
07.11.2016, 00:34
    #39342288
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 3.0.1 SuperClassic периодически падает на UDF, Classic работает без проблем
Вадим МещеряковUDF в 2.5 работала много лет на всех вариантов архитектуры сервера, ошибки не было.Это вообще не аргумент. В firebird.log -аргумент

Вадим МещеряковВот такой код проекта на Delphi XE 5IsMutlithreaded := true
ы ?
...
Рейтинг: 0 / 0
07.11.2016, 00:41
    #39342289
Firebird 3.0.1 SuperClassic периодически падает на UDF, Classic работает без проблем
udf кривые - это понятно.
А где можно найти информацию о том как правильно разрабатывать UDF для Firebird 3?
Мы много лет назад сделали собственную dll по примеру проекта TBUDF с http://www.ibase.ru/d_udf/
Для Linux собирали на FreePascal для Win на Delphi
...
Рейтинг: 0 / 0
07.11.2016, 00:46
    #39342290
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 3.0.1 SuperClassic периодически падает на UDF, Classic работает без проблем
Вадим МещеряковВот такой код проекта на 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
07.11.2016, 00:47
    #39342291
Firebird 3.0.1 SuperClassic периодически падает на UDF, Classic работает без проблем
Это вообще не аргумент. В firebird.log -аргумент
Есть firebird.log за 1.5 года, там нет ни одной ошибки с udf и больше года нет с "terminated abnormally"
...
Рейтинг: 0 / 0
07.11.2016, 00:50
    #39342293
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 3.0.1 SuperClassic периодически падает на UDF, Classic работает без проблем
Вадим Мещеряковudf кривые - это понятно.
А где можно найти информацию о том как правильно разрабатывать UDF для Firebird 3?
Мы много лет назад сделали собственную dll по примеру проекта TBUDF с http://www.ibase.ru/d_udf/
Для Linux собирали на FreePascal для Win на Delphi
Там же, где и для всех предыдущих версий. В тройке поддержка udf осталась для совместимости. Осталась нетронутой.

По поводу того, что на предыдущих версиях работало на всех архитектурах, у меня такие аргументы:
1. Я не очень верю в это;
2. Случайно везло.
...
Рейтинг: 0 / 0
07.11.2016, 01:12
    #39342296
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 3.0.1 SuperClassic периодически падает на UDF, Classic работает без проблем
Вадим МещеряковВот такой код проекта на 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
07.11.2016, 04:05
    #39342309
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 3.0.1 SuperClassic периодически падает на UDF, Classic работает без проблем
Вадим МещеряковА где можно найти информацию о том как правильно разрабатывать 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
07.11.2016, 08:53
    #39342346
Firebird 3.0.1 SuperClassic периодически падает на UDF, Classic работает без проблем
Прошу прощения, не тот исходный код привел (а из старой 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
07.11.2016, 11:46
    #39342464
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 3.0.1 SuperClassic периодически падает на UDF, Classic работает без проблем
Вадим МещеряковПрошу прощения, не тот исходный код привел (а из старой 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
07.11.2016, 11:48
    #39342468
Firebird 3.0.1 SuperClassic периодически падает на UDF, Classic работает без проблем
IsMultithreaded := true
А вот этого как раз и не было!!!!!
Спасибо за помощь.
Переделаем и проверим, теперь знаем как правильно теcтировать :)
...
Рейтинг: 0 / 0
07.11.2016, 11:50
    #39342470
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 3.0.1 SuperClassic периодически падает на UDF, Classic работает без проблем
Вадим Мещеряков,

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

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

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

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

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

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


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