powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Трассировка вызова UDF в Firebird 2.5
54 сообщений из 54, показаны все 3 страниц
Трассировка вызова UDF в Firebird 2.5
    #39157320
nicholaos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!

В firebird.log есть ошибка вида:

The user defined function: USERFUNC
referencing entrypoint: UserFunc
in module: UserUDF.dll
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.

Подскажите, можно ли настроить include_filter в fbtrace.conf так, чтобы увидеть параметры вызова.
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39157366
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nicholaos,

нельзя.
Да и не нужно - поймаешь одну багу с одним параметром и пропустишь другую с другим.
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39157404
DBConstructor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nicholaos, UDF сами писали?
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39157645
nicholaos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hvlad, Спасибо за ответ.

DBConstructor, Да, самописная.
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39157757
DBConstructor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nicholaos, проверьте, что у вас все UDF функции в библиотеке описаны как __cdecl, а не __stdcall и что Firebird сервер, который цепляет эту библиотеку, имеет тот же тип бинарного образа (32 или 64 битный), что и ваша библиотека.
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39157763
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, Dbconstructor!
You wrote on 28 января 2016 г. 17:28:10:

Dbconstructor> и что Firebird сервер, который цепляет эту библиотеку,
> имеет тот же тип бинарного образа (32 или 64 битный), что и ваша библиотека.это просто шедевр!
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39157777
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DBConstructor,

...и вроде как ещё malloc/free нужно использовать специальные FB-шные
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39157780
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, Arioch!
You wrote on 28 января 2016 г. 17:44:18:

Arioch> и вроде как ещё malloc/free нужно использовать специальные FB-шныетолько в том случае, если

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39157783
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий,

ну да

но и cdecl/stdcall далеко не всегда к AV приведет

и еще сотня другихх причин AV...
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39157804
DBConstructor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящийэто просто шедевр!
Сейчас согласен. Затупил.
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39157827
DBConstructor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AriochDBConstructor,
...и вроде как ещё malloc/free нужно использовать специальные FB-шные
"free" недоступен, есть только ib_util_malloc, который используется для передачи серверу результата по ссылке и затем, выделенная память подчищается сервером.
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39158197
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DBConstructor,

Совсем недоступен?
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39158249
DBConstructor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSery, загляни в таблицу экспорта ib_util.dll
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39158278
nicholaos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ошибка возникает нестабильно, иногда раз в сутки, иногда раз в неделю.

Соглашение о вызове сишное
function UserFunc(Value1, Value2: PChar): PChar; cdecl; export;

И библиотека, и сервер 32 бита. Цепляет точно её.

Память под результирующую строку выделяется через ib_util_malloc
function ib_util_malloc(l: integer): pointer; cdecl; external 'ib_util.dll';

Внутри функции весь код обрамлен try...except end, т.е. AV точно не внутри.

Подскажите, в чем может быть проблема.
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39158279
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DBConstructor,

Мне там ничего не нужно, я её не использую.
Так ты не ответил.
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39158281
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дак врубай откладку из дельфей, цепляйся к серверу и пользуй сколько хочешь.

Покажи, чего там в коде функции?
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39158282
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nicholaosт.е. AV точно не внутри.
Уверен? Если пытаешься модифицировать входные параметры, то получаешь по рукам.
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39158286
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nicholaosPChar): PChar
Почему не PAnsiChar?
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39158293
DBConstructor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nicholaos, может в блоке try криво обработано исключение, возникающее при выходе за пределы страницы выделенной памяти при копировании строки в буфер результата? Когда выделяете буфер через ib_util_malloc, учитываете два байта на размер строки PChar?
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39158296
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nicholaos,

как ф-ция объявлена на SQL ?
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39158301
DBConstructor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSery, если ты уточнишь, что именно имеешь в виду, отвечу.
Мы обсуждаем передачу результата по ссылке из udf функции и выделение памяти для результата через общий с сервером менеджер памяти (ib_util.dll), в котором, со стороны udf библиотеки, отсутствует возможность самостоятельно освободить выделенную через ib_util_malloc память.
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39158339
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По поводу отладки: компилировать нужно в debug и с галочкой "Include remote debug symbols" в конфигурации линковки.
Копировать udf с файлом *.rsm вкуда положено для firebird.
Прежде чем цепляться к firebird необходимо хотя-бы раз дернуть библиотеку, чтобы она предварительно подгрузилась сервером.
Ide запускать под админом, и цепляться к firebird: в окне messages должно появиться сообщение, что ваша udf загружена и отладочная информация есть.
А дальше ставим бряки и наслаждаемся.
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39158356
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DBConstructor,

Не, всё не так. Ты как обычно обсуждаешь что-то своё, со слабой привязке к написанному другими.

Ты сказал, что "free" недоступен.
Я спросил "совсем недоступен?", и не получил внятного ответа, а вместо этого рассуждения о каком-то ib_util.dll
Так доступен "free" или нет?
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39158376
DBConstructor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSery, может ты не заметил, но "free" я нарочно взял в двойные кавычки, подразумевая именно функцию освобождения памяти через общий менеджер ib_util.dll, а не просто функцию std::free(void*). А о чем твой вопрос с привязкой к данному рассуждению о возврате значений из udf функций, я так и не понял.
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39158444
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DBConstructor,

Может, ты не заметил, но до твоего упоминания ib_util.dll не участвовал в дискуссии. А вызывать alloc и free я могу сколько угодно, лишь бы при выходе всё корректно было вычищено.

Может, ты не заметил, но диплома телепата у меня нет, и догадываться, что ты подразумевал, я не могу. А потому и задал простой и конкретный вопрос. На который ты до сих пор не ответил, и не уточнил дополнительными словами своё некорректное первое высказывание.

Может, ты не заметил, но речь шла об ошибке при вызове UDF, а утверждение, что это именно ошибка с буфером в возвращаемом значении, ты высосал из пальца. Я не утверждаю, что это не может оказать правдой, но в UDF может быть и другие ошибки, приведшие к такому результату.
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39158457
nicholaos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wadmanврубай откладку из дельфей
Ошибка появляется нестабильно, при отладке все нормально.

wadmanЕсли пытаешься модифицировать входные параметры, то получаешь по рукам.
Не пытаюсь, могу поставить const
function UserFunc(const Value1, Value2: PChar): PChar; cdecl; export;

wadmanПочему не PAnsiChar?
Delphi 2007, PChar = PAnsiChar

DBConstructor может в блоке try криво обработано исключение, возникающее при выходе за пределы страницы выделенной памяти при копировании строки в буфер результата?
Результирующая строка всегда обрезается на 255 символов

hvladкак ф-ция объявлена на SQL ?
В IBExpert'е так:
Имя | Имя библиотеки | Точка входа | Входные аргументы | Возвращает |Механизм возвращения |FreeIt
USERFUNC | UserUDF.dll | UserFunc | CSTRING(32000),CSTRING(80) | CSTRING(32000) | By Reference | Х
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39158461
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nicholaosВ IBExpert'е так:DDL покажи, не надо на IBE ссылаться...
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39158468
nicholaos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hvladDDL покажи, не надо на IBE ссылаться...
DECLARE EXTERNAL FUNCTION USERFUNC
CSTRING(32000),
CSTRING(80)
RETURNS CSTRING(32000) FREE_IT
ENTRY_POINT 'UserFunc' MODULE_NAME 'UserUDF.dll';
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39158491
DBConstructor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSeryМожет, ты не заметил, но диплома телепата у меня нет, и догадываться, что ты подразумевал, я не могу. А потому и задал простой и конкретный вопрос. На который ты до сих пор не ответил, и не уточнил дополнительными словами своё некорректное первое высказывание.
То, на что ты в очередной раз сагрился: 18741936
DBConstructor"free" недоступен, есть только ib_util_malloc, который используется для передачи серверу результата по ссылке и затем, выделенная память подчищается сервером.
было ответом на: 18741658
AriochDBConstructor,
...и вроде как ещё malloc/free нужно использовать специальные FB-шные
Угадай с одного раза - о каких "FB-шные функциях malloc/free" шла речь?
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39158495
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nicholaos,

база utf?
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39158498
nicholaos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wadman,

нет, WIN1251
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39158499
DBConstructor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nicholaos, не понятно... Вы описываете udf функцию в базе с параметрами типа CSTRING, а саму функцию в библиотеке с параметрами PChar (по сути, VARCHAR). Вы, при этом, завершаете строку "нулевым" символом, чтобы указать серверу конец строки "си стринг".
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39158507
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DBConstructorс параметрами PChar (по сути, VARCHAR).
PChar это совсем не VARCHAR.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39158509
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, Dbconstructor!
You wrote on 29 января 2016 г. 14:32:09:

Dbconstructor> Вы описываете udf функцию в базе с параметрами типа CSTRING, а саму функцию в библиотеке с параметрами PChar (по сути, VARCHAR).
какой пафосный бред! восхитительно!
вася, ты зачем сюда пришел ваще?
сидел бы на своём мыскулле.
там твой бред не так заметен.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39158525
DBConstructor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov, перепутал "паскалевского" указателя на символ с типом строки. 20 лет не садился за Delphi, бывает...
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39158527
DBConstructor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий, у тебя опять оверхед говна? Сходи, просрись чтоль...
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39158533
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nicholaos,

ну код-то показывать будешь или это секрет?
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39158547
nicholaos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wadman,

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
function MakeResultString(Source: PChar): PChar;
var Len: DWORD;
begin
  result := nil;
  Len := StrLen(Source) + 1;
  result := ib_util_malloc(Len);
  if (Source = nil) or (Len = 1) then
    result[0] := #0
  else
    Move(Source^, result^, Len);
end;

function ValidateStr(Value, KodType : PChar): PChar; cdecl; export;
var
  res: string;
  r: Extended;
  pos_m, l_len, r_len, mant: integer;

  procedure GetLRLen(Value: string; out l_len, r_len: integer);
  var
    pos_, l_val: integer;
  begin
    pos_ := pos('.', Value);
    if pos_ > 0 then begin
      l_val := StrToInt(copy(Value, 1, pos_-1));
      if l_val = 0 then l_len := 0
      else l_len := length(IntToStr(l_val));
      r_len := length(copy(Value, pos_+1,length(Value)-pos_));
    end
    else begin
      l_len := length(Value);
      r_len := 0;
    end;
  end;

begin
  try
    if KodType = 'INTEGER' then res := IntToStr(StrToIntDef(Value, 0))
    else if KodType = 'REAL' then begin
      try
        DecimalSeparator := '.';
        res := ReplaceStr(Value, ',', '.');
        r := StrToFloatDef(res, 0);
        pos_m := pos('E', res);

        if pos_m > 0 then begin
          GetLRLen(copy(res, 1, pos_m-1), l_len, r_len);
          mant := StrToInt(copy(res, pos_m+1, length(res)-pos_m));
          if mant > 0 then begin
            l_len := l_len + mant;
            r_len := r_len - mant;
            if r_len < 0 then r_len := 0;
          end
          else begin
            l_len := l_len + mant;
            r_len := r_len - mant;
            if l_len < 0 then l_len := 0;
          end;
        end
        else GetLRLen(res, l_len, r_len);
        res := FloatToStrF(r, ffFixed, l_len+r_len, r_len)
      except
        res := '0';
      end;
    end
    else if KodType = 'TIMESTAMP' then res := DateTimeToStr(StrToDateTimeDef(Value, Now))
    else if KodType = 'STRING' then res := copy(Value, 1, 254);
    result := MakeResultString(PChar(res));
  except
  end;
end;
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39158578
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nicholaos,
на ibase.ru есть статья, как работать со строками.
Примеры вызова и ddl таблиц, с запросами?

П.С. try except не нужны, не помогут. Тормоза добавляют только.
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39158618
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лениво разбирать код, ты на словах скажи, что надо, может выкинуть ее нах, эту УДФ и прямо на SQL сделать обертку? потом поправишь вызова с вызова УДФ на left join sp(...) on 1=1

нет тела, нет дела. (с)
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39158873
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nicholaos,

при попадании в наружный (пустой) блок except, result остаётся неопределённым (мусором ?)
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39158875
nicholaos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ivan_Pisarevsky,

Функция получает на вход новое значение параметра и название его типа, затем проверяет корректность нового значения согласно указанному типу. Для действительного числа, например, это унификация формата - запятая заменяется точной, экспоненциальная запись преобразуется в обычную.

Если эту функцию еще можно попытаться перевести на SQL, то UDF падает еще иногда на MD5, которое не переведешь.
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39158881
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nicholaosзатем проверяет корректность нового значения согласно указанному типу.

А при опечатке в типе - падает с AV из-за неинициализированного res. Всё логично. Ну или,
как сказал, Влад, роняет сам движок возвращая ему неинициализированный указатель. Что и
наблюдается.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39158882
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, Nicholaos!
You wrote on 29 января 2016 г. 18:38:05:

Nicholaos> UDF падает еще иногда на MD5используете CryptoAPI, или самописная функция?

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39158903
nicholaos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

проверка на то, что это именно один из 4х типов происходит в процедуре SQL из которой вызывается функция.

hvlad,

да, получается, что мусор, но
1. для integer и timestamp используется def-преобразования, безопасные
2. для real со сложной логикой есть еще блок try..except с присваиванием значения при неудаче
3. для строки просто копирование

На всякий случай я поменял UDF так, чтобы гарантированно вылетал в пустой except без присваивания значения и прогнал в цикле 100000 раз. Успешно.

Мимопроходящий,

используется этот модуль:
https://github.com/rofl0r/KOL/blob/master/units/ics/MD5.pas
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39158905
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nicholaosНа всякий случай я поменял UDF так, чтобы гарантированно вылетал в пустой
except без присваивания значения и прогнал в цикле 100000 раз. Успешно.
Ты понимаешь, что не инициализированные переменные коварны?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39158912
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, Nicholaos!
You wrote on 29 января 2016 г. 18:58:40:

Nicholaos> используется этот модуль:
> https://github.com/rofl0r/KOL/blob/master/units/ics/MD5.pas
он там злоупотребляет динамическими массивами и паскалёвыми строками.
я бы в таком виде его в UDF тащить не стал.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39158913
nicholaos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

понимаю, но не могу придумать ситуацию, при которой мы попадем пустой except

И это не объясняет, почему иногда падает на MD5, которая написана так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
function MD5(str:PChar):PChar; cdecl; export;
begin
  try
    result := MakeResultString(PChar(strMD5(str)));
  except
    result := MakeResultString('');
  end;
end;
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39158924
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nicholaosэто не объясняет, почему иногда падает на MD5, которая написана так

Я бы на твоём месте изменил тип входного параметра у MakeResultString() на String и убрал
приведение к PChar на вызовах. Ибо это создаёт неопределённость времени жизни временных
переменных.

PS: Поведение StrLen() при передаче ей nil я тоже не берусь предсказать.
PPS: Значения параметров в файл лога тебе ничто не мешает писать самостоятельно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39158956
nicholaos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

Спасибо за советы.

Dimitry SibiryakovPPS: Значения параметров в файл лога тебе ничто не мешает писать самостоятельно.

Конечно, без проблем можно писать в файл или в бд в автономной транзакции.
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39159967
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSery,

да, действительно, free там нет.

чисто помогалка для функций CSTRING FREE_IT

EXPORTS TABLE:
Name: ib_util.dll
Characteristics: 00000000h
TimeDateStamp: 54800C9Bh -> 04/12/2014 10:26:19
Version: 0.00
Ordinal base: 00000001h
# of functions: 00000001h (1)
# of Names: 00000001h (1)

Entry Pt Ordn Name
00001000h 1 ib_util_malloc


DOS HEADER
Header Information :

Signature : 5A4Dh
Bytes on last page of file : 0090h
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39159980
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nicholaos,

как минимум хорошо бы прверить, бывают ли у ебя вообще внутренние исключения, и если бывают - то какие.

Например

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
function LogExc(const e: Exception);
var msg: string;
begin
  msg :=  'UDF ERROR !!! ' + ParamStr(0) + #13#10'  ' + e.ClassName + #13#10'  ' + e.Message;
 
  OutputDebugString( PChar( msg) );

// и/или засунуть её в WinNT Events Log
end;

function MD5(str:PChar):PChar; cdecl; export;
begin
  try
    result := MakeResultString(PChar(strMD5(str)));
  except
    on e: Exception do begin
      LogExc(e);
      result := MakeResultString('');
    end;
  end;
end;
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39159983
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nicholaos
Код: pascal
1.
2.
3.
4.
5.
function ValidateStr(Value, KodType : PChar): PChar; cdecl; export;
.....
begin
  try
    if KodType = 'INTEGER' then.....



Есть у мну смутное подозрение, что тут у нас может оказаться сравнение указателей, которое почти всегда даст false

Я бы сделал таки


Код: pascal
1.
2.
3.
4.
5.
6.
7.
function ValidateStr(sqlValue, sqlKodType : PChar): PChar; cdecl; export;
var KodType: string;
begin
  Result := nil;                                         // Здоровая паранойя
  KodType := UpperCase(Trim(sqlKodType)); // Здоровущая паранойя
  try
    if KodType = 'INTEGER' then.......
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39160779
nicholaos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем спасибо за участие!

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


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