|
Трассировка вызова UDF в Firebird 2.5
|
|||
---|---|---|---|
#18+
Здравствуйте! В 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 так, чтобы увидеть параметры вызова. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2016, 12:23 |
|
Трассировка вызова UDF в Firebird 2.5
|
|||
---|---|---|---|
#18+
nicholaos, нельзя. Да и не нужно - поймаешь одну багу с одним параметром и пропустишь другую с другим. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2016, 12:55 |
|
Трассировка вызова UDF в Firebird 2.5
|
|||
---|---|---|---|
#18+
nicholaos, UDF сами писали? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2016, 13:15 |
|
Трассировка вызова UDF в Firebird 2.5
|
|||
---|---|---|---|
#18+
hvlad, Спасибо за ответ. DBConstructor, Да, самописная. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2016, 15:41 |
|
Трассировка вызова UDF в Firebird 2.5
|
|||
---|---|---|---|
#18+
nicholaos, проверьте, что у вас все UDF функции в библиотеке описаны как __cdecl, а не __stdcall и что Firebird сервер, который цепляет эту библиотеку, имеет тот же тип бинарного образа (32 или 64 битный), что и ваша библиотека. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2016, 17:26 |
|
Трассировка вызова UDF в Firebird 2.5
|
|||
---|---|---|---|
#18+
Hello, Dbconstructor! You wrote on 28 января 2016 г. 17:28:10: Dbconstructor> и что Firebird сервер, который цепляет эту библиотеку, > имеет тот же тип бинарного образа (32 или 64 битный), что и ваша библиотека.это просто шедевр! Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2016, 17:28 |
|
Трассировка вызова UDF в Firebird 2.5
|
|||
---|---|---|---|
#18+
DBConstructor, ...и вроде как ещё malloc/free нужно использовать специальные FB-шные ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2016, 17:39 |
|
Трассировка вызова UDF в Firebird 2.5
|
|||
---|---|---|---|
#18+
Hello, Arioch! You wrote on 28 января 2016 г. 17:44:18: Arioch> и вроде как ещё malloc/free нужно использовать специальные FB-шныетолько в том случае, если Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2016, 17:44 |
|
Трассировка вызова UDF в Firebird 2.5
|
|||
---|---|---|---|
#18+
Мимопроходящий, ну да но и cdecl/stdcall далеко не всегда к AV приведет и еще сотня другихх причин AV... ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2016, 17:48 |
|
Трассировка вызова UDF в Firebird 2.5
|
|||
---|---|---|---|
#18+
Мимопроходящийэто просто шедевр! Сейчас согласен. Затупил. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2016, 18:11 |
|
Трассировка вызова UDF в Firebird 2.5
|
|||
---|---|---|---|
#18+
AriochDBConstructor, ...и вроде как ещё malloc/free нужно использовать специальные FB-шные "free" недоступен, есть только ib_util_malloc, который используется для передачи серверу результата по ссылке и затем, выделенная память подчищается сервером. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2016, 18:29 |
|
Трассировка вызова UDF в Firebird 2.5
|
|||
---|---|---|---|
#18+
DBConstructor, Совсем недоступен? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2016, 09:26 |
|
Трассировка вызова UDF в Firebird 2.5
|
|||
---|---|---|---|
#18+
WildSery, загляни в таблицу экспорта ib_util.dll ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2016, 10:10 |
|
Трассировка вызова UDF в Firebird 2.5
|
|||
---|---|---|---|
#18+
Ошибка возникает нестабильно, иногда раз в сутки, иногда раз в неделю. Соглашение о вызове сишное 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 точно не внутри. Подскажите, в чем может быть проблема. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2016, 10:31 |
|
Трассировка вызова UDF в Firebird 2.5
|
|||
---|---|---|---|
#18+
DBConstructor, Мне там ничего не нужно, я её не использую. Так ты не ответил. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2016, 10:32 |
|
Трассировка вызова UDF в Firebird 2.5
|
|||
---|---|---|---|
#18+
Дак врубай откладку из дельфей, цепляйся к серверу и пользуй сколько хочешь. Покажи, чего там в коде функции? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2016, 10:34 |
|
Трассировка вызова UDF в Firebird 2.5
|
|||
---|---|---|---|
#18+
nicholaosт.е. AV точно не внутри. Уверен? Если пытаешься модифицировать входные параметры, то получаешь по рукам. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2016, 10:34 |
|
Трассировка вызова UDF в Firebird 2.5
|
|||
---|---|---|---|
#18+
nicholaosPChar): PChar Почему не PAnsiChar? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2016, 10:36 |
|
Трассировка вызова UDF в Firebird 2.5
|
|||
---|---|---|---|
#18+
nicholaos, может в блоке try криво обработано исключение, возникающее при выходе за пределы страницы выделенной памяти при копировании строки в буфер результата? Когда выделяете буфер через ib_util_malloc, учитываете два байта на размер строки PChar? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2016, 10:45 |
|
Трассировка вызова UDF в Firebird 2.5
|
|||
---|---|---|---|
#18+
nicholaos, как ф-ция объявлена на SQL ? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2016, 10:47 |
|
Трассировка вызова UDF в Firebird 2.5
|
|||
---|---|---|---|
#18+
WildSery, если ты уточнишь, что именно имеешь в виду, отвечу. Мы обсуждаем передачу результата по ссылке из udf функции и выделение памяти для результата через общий с сервером менеджер памяти (ib_util.dll), в котором, со стороны udf библиотеки, отсутствует возможность самостоятельно освободить выделенную через ib_util_malloc память. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2016, 10:51 |
|
Трассировка вызова UDF в Firebird 2.5
|
|||
---|---|---|---|
#18+
По поводу отладки: компилировать нужно в debug и с галочкой "Include remote debug symbols" в конфигурации линковки. Копировать udf с файлом *.rsm вкуда положено для firebird. Прежде чем цепляться к firebird необходимо хотя-бы раз дернуть библиотеку, чтобы она предварительно подгрузилась сервером. Ide запускать под админом, и цепляться к firebird: в окне messages должно появиться сообщение, что ваша udf загружена и отладочная информация есть. А дальше ставим бряки и наслаждаемся. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2016, 11:37 |
|
Трассировка вызова UDF в Firebird 2.5
|
|||
---|---|---|---|
#18+
DBConstructor, Не, всё не так. Ты как обычно обсуждаешь что-то своё, со слабой привязке к написанному другими. Ты сказал, что "free" недоступен. Я спросил "совсем недоступен?", и не получил внятного ответа, а вместо этого рассуждения о каком-то ib_util.dll Так доступен "free" или нет? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2016, 11:53 |
|
Трассировка вызова UDF в Firebird 2.5
|
|||
---|---|---|---|
#18+
WildSery, может ты не заметил, но "free" я нарочно взял в двойные кавычки, подразумевая именно функцию освобождения памяти через общий менеджер ib_util.dll, а не просто функцию std::free(void*). А о чем твой вопрос с привязкой к данному рассуждению о возврате значений из udf функций, я так и не понял. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2016, 12:12 |
|
Трассировка вызова UDF в Firebird 2.5
|
|||
---|---|---|---|
#18+
DBConstructor, Может, ты не заметил, но до твоего упоминания ib_util.dll не участвовал в дискуссии. А вызывать alloc и free я могу сколько угодно, лишь бы при выходе всё корректно было вычищено. Может, ты не заметил, но диплома телепата у меня нет, и догадываться, что ты подразумевал, я не могу. А потому и задал простой и конкретный вопрос. На который ты до сих пор не ответил, и не уточнил дополнительными словами своё некорректное первое высказывание. Может, ты не заметил, но речь шла об ошибке при вызове UDF, а утверждение, что это именно ошибка с буфером в возвращаемом значении, ты высосал из пальца. Я не утверждаю, что это не может оказать правдой, но в UDF может быть и другие ошибки, приведшие к такому результату. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2016, 13:46 |
|
Трассировка вызова UDF в Firebird 2.5
|
|||
---|---|---|---|
#18+
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 | Х ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2016, 13:54 |
|
Трассировка вызова UDF в Firebird 2.5
|
|||
---|---|---|---|
#18+
nicholaosВ IBExpert'е так:DDL покажи, не надо на IBE ссылаться... ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2016, 13:58 |
|
Трассировка вызова UDF в Firebird 2.5
|
|||
---|---|---|---|
#18+
hvladDDL покажи, не надо на IBE ссылаться... DECLARE EXTERNAL FUNCTION USERFUNC CSTRING(32000), CSTRING(80) RETURNS CSTRING(32000) FREE_IT ENTRY_POINT 'UserFunc' MODULE_NAME 'UserUDF.dll'; ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2016, 14:01 |
|
Трассировка вызова UDF в Firebird 2.5
|
|||
---|---|---|---|
#18+
WildSeryМожет, ты не заметил, но диплома телепата у меня нет, и догадываться, что ты подразумевал, я не могу. А потому и задал простой и конкретный вопрос. На который ты до сих пор не ответил, и не уточнил дополнительными словами своё некорректное первое высказывание. То, на что ты в очередной раз сагрился: 18741936 DBConstructor"free" недоступен, есть только ib_util_malloc, который используется для передачи серверу результата по ссылке и затем, выделенная память подчищается сервером. было ответом на: 18741658 AriochDBConstructor, ...и вроде как ещё malloc/free нужно использовать специальные FB-шные Угадай с одного раза - о каких "FB-шные функциях malloc/free" шла речь? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2016, 14:16 |
|
Трассировка вызова UDF в Firebird 2.5
|
|||
---|---|---|---|
#18+
nicholaos, база utf? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2016, 14:20 |
|
Трассировка вызова UDF в Firebird 2.5
|
|||
---|---|---|---|
#18+
wadman, нет, WIN1251 ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2016, 14:25 |
|
Трассировка вызова UDF в Firebird 2.5
|
|||
---|---|---|---|
#18+
nicholaos, не понятно... Вы описываете udf функцию в базе с параметрами типа CSTRING, а саму функцию в библиотеке с параметрами PChar (по сути, VARCHAR). Вы, при этом, завершаете строку "нулевым" символом, чтобы указать серверу конец строки "си стринг". ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2016, 14:26 |
|
Трассировка вызова UDF в Firebird 2.5
|
|||
---|---|---|---|
#18+
DBConstructorс параметрами PChar (по сути, VARCHAR). PChar это совсем не VARCHAR. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2016, 14:32 |
|
Трассировка вызова UDF в Firebird 2.5
|
|||
---|---|---|---|
#18+
Hello, Dbconstructor! You wrote on 29 января 2016 г. 14:32:09: Dbconstructor> Вы описываете udf функцию в базе с параметрами типа CSTRING, а саму функцию в библиотеке с параметрами PChar (по сути, VARCHAR). какой пафосный бред! восхитительно! вася, ты зачем сюда пришел ваще? сидел бы на своём мыскулле. там твой бред не так заметен. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2016, 14:33 |
|
Трассировка вызова UDF в Firebird 2.5
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, перепутал "паскалевского" указателя на символ с типом строки. 20 лет не садился за Delphi, бывает... ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2016, 14:40 |
|
Трассировка вызова UDF в Firebird 2.5
|
|||
---|---|---|---|
#18+
Мимопроходящий, у тебя опять оверхед говна? Сходи, просрись чтоль... ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2016, 14:41 |
|
Трассировка вызова UDF в Firebird 2.5
|
|||
---|---|---|---|
#18+
nicholaos, ну код-то показывать будешь или это секрет? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2016, 14:46 |
|
Трассировка вызова UDF в Firebird 2.5
|
|||
---|---|---|---|
#18+
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.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2016, 14:56 |
|
Трассировка вызова UDF в Firebird 2.5
|
|||
---|---|---|---|
#18+
nicholaos, на ibase.ru есть статья, как работать со строками. Примеры вызова и ddl таблиц, с запросами? П.С. try except не нужны, не помогут. Тормоза добавляют только. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2016, 15:19 |
|
Трассировка вызова UDF в Firebird 2.5
|
|||
---|---|---|---|
#18+
Лениво разбирать код, ты на словах скажи, что надо, может выкинуть ее нах, эту УДФ и прямо на SQL сделать обертку? потом поправишь вызова с вызова УДФ на left join sp(...) on 1=1 нет тела, нет дела. (с) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2016, 15:37 |
|
Трассировка вызова UDF в Firebird 2.5
|
|||
---|---|---|---|
#18+
nicholaos, при попадании в наружный (пустой) блок except, result остаётся неопределённым (мусором ?) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2016, 18:25 |
|
Трассировка вызова UDF в Firebird 2.5
|
|||
---|---|---|---|
#18+
Ivan_Pisarevsky, Функция получает на вход новое значение параметра и название его типа, затем проверяет корректность нового значения согласно указанному типу. Для действительного числа, например, это унификация формата - запятая заменяется точной, экспоненциальная запись преобразуется в обычную. Если эту функцию еще можно попытаться перевести на SQL, то UDF падает еще иногда на MD5, которое не переведешь. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2016, 18:28 |
|
Трассировка вызова UDF в Firebird 2.5
|
|||
---|---|---|---|
#18+
nicholaosзатем проверяет корректность нового значения согласно указанному типу. А при опечатке в типе - падает с AV из-за неинициализированного res. Всё логично. Ну или, как сказал, Влад, роняет сам движок возвращая ему неинициализированный указатель. Что и наблюдается. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2016, 18:38 |
|
Трассировка вызова UDF в Firebird 2.5
|
|||
---|---|---|---|
#18+
Hello, Nicholaos! You wrote on 29 января 2016 г. 18:38:05: Nicholaos> UDF падает еще иногда на MD5используете CryptoAPI, или самописная функция? Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2016, 18:38 |
|
Трассировка вызова UDF в Firebird 2.5
|
|||
---|---|---|---|
#18+
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 ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2016, 18:54 |
|
Трассировка вызова UDF в Firebird 2.5
|
|||
---|---|---|---|
#18+
nicholaosНа всякий случай я поменял UDF так, чтобы гарантированно вылетал в пустой except без присваивания значения и прогнал в цикле 100000 раз. Успешно. Ты понимаешь, что не инициализированные переменные коварны?.. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2016, 18:56 |
|
Трассировка вызова UDF в Firebird 2.5
|
|||
---|---|---|---|
#18+
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 ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2016, 19:02 |
|
Трассировка вызова UDF в Firebird 2.5
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, понимаю, но не могу придумать ситуацию, при которой мы попадем пустой except И это не объясняет, почему иногда падает на MD5, которая написана так: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2016, 19:03 |
|
Трассировка вызова UDF в Firebird 2.5
|
|||
---|---|---|---|
#18+
nicholaosэто не объясняет, почему иногда падает на MD5, которая написана так Я бы на твоём месте изменил тип входного параметра у MakeResultString() на String и убрал приведение к PChar на вызовах. Ибо это создаёт неопределённость времени жизни временных переменных. PS: Поведение StrLen() при передаче ей nil я тоже не берусь предсказать. PPS: Значения параметров в файл лога тебе ничто не мешает писать самостоятельно. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2016, 19:17 |
|
Трассировка вызова UDF в Firebird 2.5
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, Спасибо за советы. Dimitry SibiryakovPPS: Значения параметров в файл лога тебе ничто не мешает писать самостоятельно. Конечно, без проблем можно писать в файл или в бд в автономной транзакции. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2016, 21:02 |
|
Трассировка вызова UDF в Firebird 2.5
|
|||
---|---|---|---|
#18+
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 ... |
|||
:
Нравится:
Не нравится:
|
|||
01.02.2016, 12:18 |
|
Трассировка вызова UDF в Firebird 2.5
|
|||
---|---|---|---|
#18+
nicholaos, как минимум хорошо бы прверить, бывают ли у ебя вообще внутренние исключения, и если бывают - то какие. Например Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
... |
|||
:
Нравится:
Не нравится:
|
|||
01.02.2016, 12:29 |
|
Трассировка вызова UDF в Firebird 2.5
|
|||
---|---|---|---|
#18+
nicholaos Код: pascal 1. 2. 3. 4. 5.
Есть у мну смутное подозрение, что тут у нас может оказаться сравнение указателей, которое почти всегда даст false Я бы сделал таки Код: pascal 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
01.02.2016, 12:32 |
|
|
start [/forum/topic.php?all=1&fid=40&tid=1562367]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
42ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
85ms |
get tp. blocked users: |
2ms |
others: | 261ms |
total: | 437ms |
0 / 0 |