FB 2.0.3 Падает

Access Violation, некорректное выполнение запросов или вызовов API, ошибки утилит командной строки, в общем все, что вам мешает работать

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

Ответить
armagedon2007
Сообщения: 44
Зарегистрирован: 14 мар 2008, 21:01

FB 2.0.3 Падает

Сообщение armagedon2007 » 21 мар 2008, 12:37

Для чтения из базы исполюзую транзакцию
read
read_committed
rec_version
Для записи
write
consistency
В 1.5 все работает, в 2.х падает сервер

Не удается найти описание для идентификатора события 281 из источника FirebirdGuardianDefaultInstance. Вызывающий данное событие компонент не установлен на этом локальном компьютере или поврежден. Установите или восстановите компонент на локальном компьютере.

Если событие возникло на другом компьютере, возможно, потребуется сохранить отображаемые сведения вместе с событием.

К событию были добавлены следующие сведения:

Abnormal Termination: C:\Program Files\Firebird\Firebird_2_0\bin\fbserver.exe: terminated abnormally (4294967295)

И сообщение об ошибке об ошибке Error reading data from the connection потом Error writing to the connection, после с этой таблицы ничего не читается.
Как быть?

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

Сообщение kdv » 21 мар 2008, 12:46

надо постараться идентифицировать место, где происходит ошибка. если при чтении таблицы, значит база битая.

armagedon2007
Сообщения: 44
Зарегистрирован: 14 мар 2008, 21:01

Сообщение armagedon2007 » 21 мар 2008, 13:11

kdv писал(а):надо постараться идентифицировать место, где происходит ошибка. если при чтении таблицы, значит база битая.
После записи нельзя прочитать из ПО даже если сервер рестартануть,
но при этом IBExpert все читает. Базу создал новую залил все данные через IBExpert и тоже самое.
Запись при этом в таблице существует, но прочитать ее из ПО никак.
Выдает выше указанную ощибку

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 21 мар 2008, 13:23

УДФ

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

Сообщение hvlad » 21 мар 2008, 13:27

Читаем firebird.log, вслух

armagedon2007
Сообщения: 44
Зарегистрирован: 14 мар 2008, 21:01

Сообщение armagedon2007 » 21 мар 2008, 13:32

Merlin писал(а):УДФ
Ну есть такое дело.
В чем там проблема?

armagedon2007
Сообщения: 44
Зарегистрирован: 14 мар 2008, 21:01

Сообщение armagedon2007 » 21 мар 2008, 13:33

hvlad писал(а):Читаем firebird.log, вслух
The user defined function: ROUNDTO
referencing entrypoint: RoundTo
in module: UdfRest
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.

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

Сообщение kdv » 21 мар 2008, 13:42

вот и причина. а "работает в 1.5, а в 2.03 не работает" - значит, скорее всего, выделяет память через malloc, а не так как положено. Т.е. автор udf не читал faq на ibase.ru :)

armagedon2007
Сообщения: 44
Зарегистрирован: 14 мар 2008, 21:01

Сообщение armagedon2007 » 21 мар 2008, 13:50

kdv писал(а):вот и причина. а "работает в 1.5, а в 2.03 не работает" - значит, скорее всего, выделяет память через malloc, а не так как положено. Т.е. автор udf не читал faq на ibase.ru :)
Тоесть тут чтото не так?

Код: Выделить всё

function RoundTo(var Value: Double; var Digits: Integer):PDouble; cdecl; export;
begin
  SetRoundMode(rmNearest);
  Value := Math.RoundTo(Value, Digits);
  Result := @Value;
end;
Последний раз редактировалось armagedon2007 21 мар 2008, 14:06, всего редактировалось 1 раз.

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 21 мар 2008, 14:01

Зачем на выходе PDouble? Как процедура в БД объявлена?

armagedon2007
Сообщения: 44
Зарегистрирован: 14 мар 2008, 21:01

Сообщение armagedon2007 » 21 мар 2008, 14:04

WildSery писал(а):Зачем на выходе PDouble? Как процедура в БД объявлена?
Почемуто без PDouble в 1.5 не так работало.

Код: Выделить всё

DECLARE EXTERNAL FUNCTION ROUNDTO
    DOUBLE PRECISION,
    INTEGER
RETURNS DOUBLE PRECISION FREE_IT
ENTRY_POINT 'RoundTo' MODULE_NAME 'UdfRest';

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 21 мар 2008, 14:53

Что "FREE IT"? Ты выделял память под переменную?
Возвращай как все люди, BY VALUE, и возврат соответственно просто DOUBLE в коде.

Hint: Срочно читать статью. Даже если уже "смотрел".

armagedon2007
Сообщения: 44
Зарегистрирован: 14 мар 2008, 21:01

Сообщение armagedon2007 » 21 мар 2008, 15:34

WildSery писал(а):Hint: Срочно читать статью. Даже если уже "смотрел".
Прочитай лучше сам и скажи вчем отличее того, что я написал от того, что во втором примере указано? Или статья устарела для FB 2.x
Переделал все заработало.
Спасибо.

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 21 мар 2008, 16:15

Отличие в строке
Как научиться писать UDF для InterBase за 21 мин. писал(а):!!!Числовые переменные не рекомендуется возвращать by reference (по ссылке) или указывать для них FREE_IT. Возвращать числовые типы данных можно только by value (по значению).
:wink:

armagedon2007
Сообщения: 44
Зарегистрирован: 14 мар 2008, 21:01

Сообщение armagedon2007 » 21 мар 2008, 16:18

WildSery писал(а):Отличие в строке
Как научиться писать UDF для InterBase за 21 мин. писал(а):!!!Числовые переменные не рекомендуется возвращать by reference (по ссылке) или указывать для них FREE_IT. Возвращать числовые типы данных можно только by value (по значению).
:wink:
Это я читать умею. А в примере как написано?

Код: Выделить всё

function Add_B2(var iSmall: SmallInt; var iLong: Integer): PInteger; cdecl; export; 
//              ^^^                   ^^^                  ^^^^^^^^ 
//              by reference          by reference         by reference 
begin 
  iLong := iSmall + iLong; 
  Result := @iLong; 
end; 

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 21 мар 2008, 16:24

armagedon2007 писал(а):Это я читать умею. А в примере как написано?
Ну а сразу за примером, его объяснение? ;)
Или то, что FREE_IT это отдельный способ, не просто возврат по ссылке...

Мысли про себя ... и почему сразу на второй пример потянуло?

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

Сообщение hvlad » 21 мар 2008, 16:42

armagedon2007 писал(а):Это я читать умею. А в примере как написано?
Где там хоть слово про FREE_IT ???

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

Сообщение kdv » 24 мар 2008, 08:57

как читали по диагонали, так и будут. и FREE_IT к числовым типам лепят. Видать, поколение нынче такое...

Ответить