Проблема с работой UDF

Запросы, планы, оптимизация запросов, ...

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

Ответить
folko
Сообщения: 16
Зарегистрирован: 27 янв 2012, 13:02

Проблема с работой UDF

Сообщение folko » 27 янв 2012, 13:41

Доброго время суток!

Есть проблема с работой пользовательской UDF под Firebird ClassicServer 2.1.

библиотека UDF написана и собрана в Delphi, в ней содержится только одна функция, в которой нет ничего военного: возвращается число, которое построено из первых символов входной строки. Под Firebird SuperServer 2.1 эта UDF работает без проблем.

Текст ошибки приложения:
Error writing data to the connection.

Текст ошибки ibexpert:
Unsuccessful execution caused by a system error that precludes
successful execution of subsequent statements.
Error writing data to the connection.

Подскажите, в чем может заключаться возможная причина проблемы?

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Re: Проблема с работой UDF

Сообщение Dimitry Sibiryakov » 27 янв 2012, 16:02

В том, что в UDF сидит гражданский баг, который и валит сервер.

folko
Сообщения: 16
Зарегистрирован: 27 янв 2012, 13:02

Re: Проблема с работой UDF

Сообщение folko » 27 янв 2012, 18:04

Dimitry Sibiryakov писал(а):В том, что в UDF сидит гражданский баг, который и валит сервер.
Хорошо, а есть описание различий между SuperServer и ClassicServer в подходе к UDF чтобы выявить какой же там нехороший гражданский баг сидит?

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

Re: Проблема с работой UDF

Сообщение hvlad » 27 янв 2012, 19:18

Нет таких различий. Пишите код правильно. Про UDF написаны горы статей, примеров и прочего...

folko
Сообщения: 16
Зарегистрирован: 27 янв 2012, 13:02

Re: Проблема с работой UDF

Сообщение folko » 27 янв 2012, 23:10

hvlad писал(а):Нет таких различий. Пишите код правильно. Про UDF написаны горы статей, примеров и прочего...
Если бы таких различий не было, то поведение по отношению к одной и той же UDF и у SuperServer и у ClassicServer было бы одинаковым, однако же эта UDF без проблем используется серверами Firebird от 1.0 до 2.5 в режиме SuperServer, и только у Firebird 2.5 в режиме ClassicServer она глючит... кагбе нет логики в том, что UDF не правильная если она работает со всеми конфигурациями, кроме одной...

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

Re: Проблема с работой UDF

Сообщение hvlad » 28 янв 2012, 00:34

Или вы слушаете хорошие советы, или сами всё знаете. В последнем случае нет смысла спрашивать на форуме.

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

Re: Проблема с работой UDF

Сообщение kdv » 28 янв 2012, 01:39

проблема решается очень просто. Берете дельфи, свою юдф, затем подсоединяетесь к классику, в отладчике ловите этот процесс, зацепляетесь, и отлаживаете udf. И там становится сразу все ясно.
Надеюсь, что все правила написания udf соблюдены.

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Re: Проблема с работой UDF

Сообщение Dimitry Sibiryakov » 29 янв 2012, 15:28

hvlad писал(а):Нет таких различий.
Если UDF лезет к левому адресу памяти, то возможны два исхода:
1) Эта память выделена и получаем memory corruption
2) Эта память не выделена и получаем Access Violation.

Поскольку классик использует меньше памяти, то вероятность второго исхода выше.

folko
Сообщения: 16
Зарегистрирован: 27 янв 2012, 13:02

Re: Проблема с работой UDF

Сообщение folko » 30 янв 2012, 12:12

Dimitry Sibiryakov писал(а):
hvlad писал(а):Нет таких различий.
Если UDF лезет к левому адресу памяти, то возможны два исхода:
1) Эта память выделена и получаем memory corruption
2) Эта память не выделена и получаем Access Violation.

Поскольку классик использует меньше памяти, то вероятность второго исхода выше.
Ага, спасибо, тут уже есть логика.
Проверил описание функции, вроде все норм:
function DigitFromString(var Str: PChar): Integer; cdecl; export;
Функция возвращает значение bу Value... В теле функции пара циклов и работа с Str...
Result инициализируется в начале result = 0, а дальше как насчитает...

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

Re: Проблема с работой UDF

Сообщение hvlad » 30 янв 2012, 12:35

folko писал(а):function DigitFromString(var Str: PChar): Integer; cdecl; export;
Жевать надо ?

folko
Сообщения: 16
Зарегистрирован: 27 янв 2012, 13:02

Re: Проблема с работой UDF

Сообщение folko » 30 янв 2012, 12:42

hvlad писал(а):
folko писал(а):function DigitFromString(var Str: PChar): Integer; cdecl; export;
Жевать надо ?
Спасибо, но это я уже нашел :)

Вообще проблема была изначально вот в этом:
function DigitFromString(Str: PChar): Integer; stdcall;

Потом я поменял на cdecl, и сдуру влепил зачем-то var. Затем убрал var и все заработало. Но, теперь остается вопрос: в базе эта функция объявлена без free_it. Будет ли работать без утечек SuperServer с объявлением через cdecl?

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

Re: Проблема с работой UDF

Сообщение hvlad » 30 янв 2012, 13:30

folko писал(а):Но, теперь остается вопрос: в базе эта функция объявлена без free_it. Будет ли работать без утечек SuperServer с объявлением через cdecl?
а) FREE_IT используется для другого
б) все UDF обязаны быть с cdecl

Может всё-таки почитать что-то про то, как писать UDF ? Иначе такие вопросы будут возникать постоянно.

folko
Сообщения: 16
Зарегистрирован: 27 янв 2012, 13:02

Re: Проблема с работой UDF

Сообщение folko » 30 янв 2012, 13:57

hvlad писал(а):
folko писал(а):Но, теперь остается вопрос: в базе эта функция объявлена без free_it. Будет ли работать без утечек SuperServer с объявлением через cdecl?
а) FREE_IT используется для другого
б) все UDF обязаны быть с cdecl

Может всё-таки почитать что-то про то, как писать UDF ? Иначе такие вопросы будут возникать постоянно.
Может Вы все-таки начнете отвечать по существу? Вашу компетентность я понял уже из фразы про то, что различий - нет, хотя способ очистки стека аргументов уже влияет на работу ClassicServer и SuperServer. Если Вы не можете ответить да или нет по второму вопросу(я вроде не просил пока большего) или ткнуть в конкретную тему с описанием почему используется именно cdecl, чтобы я мог почитать и понять а) почему работало с stdcall и б) на что повлияет изменение для SuperSever только в самой udf с stdcall на cdecl - то проходите мимо и не засоряйте тему обширным описанием про "что-то" и "где-то". На данный момент вопрос стоит в том, чтоб просто использовать в дальнейшем эту билиотеку udf для любой конфигурации или две библиотеки для SuperServer и для ClassicServer отдельно, так как написана эта библиотека была давно, не мной и используется на многих-многих машинах, и обновление баз на них - не совсем приемлимо.

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

Re: Проблема с работой UDF

Сообщение hvlad » 30 янв 2012, 14:24

Смешной

folko
Сообщения: 16
Зарегистрирован: 27 янв 2012, 13:02

Re: Проблема с работой UDF

Сообщение folko » 30 янв 2012, 14:44

Может быть, хотя Ваши слова меня тоже веселят изрядно, но Вы единственный кто флудит на ветке, уберите слово разработчик и напишите троль, это будет больше соответствовать действительности.

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

Re: Проблема с работой UDF

Сообщение kdv » 31 янв 2012, 10:00

Может Вы все-таки начнете отвечать по существу?
может быть, вы перестанете валять дурака?

Теперь по вашему бреду
- stdcall работало потому, что вам повезло
- udf должны иметь объявление cdecl, аминь, независимо от архитектуры сервера, или InterBase/Firebird. В документации к InterBase в одно время была ошибка (рекомендован stdcall вместо cdecl).

Будете дальше упираться и писать ерунду - точно забаню. Я не люблю, когда на форуме задают вопросы, не прочитав вначале ничего на ibase.ru. А документов и примеров по udf там достаточно.

p.s. hvlad - один из ведущих разработчиков СУБД Firebird.

folko
Сообщения: 16
Зарегистрирован: 27 янв 2012, 13:02

Re: Проблема с работой UDF

Сообщение folko » 31 янв 2012, 15:23

kdv писал(а):
Может Вы все-таки начнете отвечать по существу?
может быть, вы перестанете валять дурака?

Теперь по вашему бреду
- stdcall работало потому, что вам повезло
- udf должны иметь объявление cdecl, аминь, независимо от архитектуры сервера, или InterBase/Firebird. В документации к InterBase в одно время была ошибка (рекомендован stdcall вместо cdecl).

Будете дальше упираться и писать ерунду - точно забаню. Я не люблю, когда на форуме задают вопросы, не прочитав вначале ничего на ibase.ru. А документов и примеров по udf там достаточно.

p.s. hvlad - один из ведущих разработчиков СУБД Firebird.
Вы меня конечно можете забанить и успокоить Вашу совесть, что Вашего "ведущего разработчика" обижают, но на этой теме по существу ответили только Вы и Dimitry Sibiryakov, причем после прочтения поста Дмитрия - проблема решилась в течении 10 минут, а после постов Вашего "ведущего разработчика" только росла демагогия. Я же не просил решать за меня, не приводил код в котором нужно исправить баг, я получил возможную причину, изучил конкретную необходимую документацию и сам исправил. Баг был давно, создан не мно и после решения я на очень долго забуду про UDF. Теперь по второму вопросу: "В документации к InterBase в одно время была ошибка (рекомендован stdcall вместо cdecl).
", - вам не стыдно после этих слов отсылать на повторное прочтение документации? :) Ну это просто юмор, может и не понравится :) Теперь по существу, баг вроде как решен, но стоит проблема: есть решение, которое стабильно, повторяю, стабильно работает на различных конфигурациях и оно включает в себя объявление функции в базе и саму dll. Меня заинтересовал вопрос, будут ли неприятные последствия, если обновить только dll и не менять объявление функции в базе. Я протестировал у себя только подмену dll и получил положительный результат, все работает корректно. Но что такое одна машина с опытом и наработками специалистов, ведь, например, утечки памяти быстро не потестишь. Я задал вопрос, профессионал в своем деле просто бы ответил - да надо менять или нет, не надо менять, всё, тема закрыта - я исправил баг dll, если надо - предложил обходное решение, и мое и его время - сэкономлено Нет, влез опять "ведущий специалист" и начал очередной флуд. Не знаю как ВЫ, но мое ИМХО - время затраченное на изучение чего-либо должно быть намного меньше чем время этого чего-либо применения, иначе можнознать много всего, но быть плохим специалистом в своей области. И еще немного прежде чем забаните - если ПО ведет себя не предсказуемо("stdcall работало потому, что вам повезло"), то это проблема ПО и разработчиков, а не пользователя, который этим ПО пользуется и которому это ПО позволяет некорректные действия... хотя в данном случае это очень спорно, конечно. Цените свое время, нет желания отвечать - проходите мимо.

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

Re: Проблема с работой UDF

Сообщение hvlad » 31 янв 2012, 19:05

Мало того, что невежа, так ещё и гордится этим :lol:

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

Re: Проблема с работой UDF

Сообщение kdv » 31 янв 2012, 20:12

давайте так - вы написали фиговую UDF, затем вы начали страдать фигней, и писать черт знает что, а потом обвинять пристутствующих здесь, что ваша ЮФД не работает нормально.
не приводил код в котором нужно исправить баг,
и зря.
вам не стыдно после этих слов отсылать на повторное прочтение документации?
мне -нет. я работаю с InterBase версии 4.0, и бредовые комменты в доке по поводу stdcall меня не пугают и не смущают. Благо я на сайт выложил достаточно собственных примеров, которые РАБОТАЮТ. По поводу stdcall я своевременно отписал авторам доки по InterBase, и они это исправили (на cdecl).
да надо менять или нет, не надо менять, всё, тема закрыта - я исправил баг dll,
вы херней занимаетесь.
Нет, влез опять "ведущий специалист" и начал очередной флуд.
ну конечно. мои занятия с InterBase 4.0 и далее можно спустить в сортир, да? Это 1995 год, напомню.
Не знаю как ВЫ, но мое ИМХО - время затраченное на изучение чего-либо должно быть намного меньше чем время этого чего-либо применения,
если человек не читает примеры и документацию, то он идет лесом. Вы ПЛОХОЙ СПЕЦИАЛИСТ, и вы не специалист вообще.
то это проблема ПО и разработчиков, а не пользователя,
если программист не соображает, то я ничем не могу помочь.

folko
Сообщения: 16
Зарегистрирован: 27 янв 2012, 13:02

Re: Проблема с работой UDF

Сообщение folko » 01 фев 2012, 12:15

Какой-то клуб любителей пофлудить, а не форум.
вы херней занимаетесь.
- вот все что мне от Вас было нужно, спасибо. Хорошо, что не только "ведущие разработчики у вас есть.
Тема закрыта.

Ответить