|
Firebird 3.0.3 - 3.0.4 SS Linux и udf на FreePascal со строковыми параметрами
|
|||
---|---|---|---|
#18+
Добрый день Firebird 3.0.3 - 3.0.4 SS под Linux падает на нашей UDF при одновременном обращении к ней из нескольких коннектов (не важно какая функция из трех вызывается). UDF собрана на FreePascal 3.0.4. Проблема проявляется только на Linux и только в режиме SS. Ранее под Linux использовали только режим CS и там проблема не возникала, сейчас не может из за этого перейти на SS. Для того что бы разобраться сделали простой тестовый проект. Три функции, во всех попробовали разный способ вернуть строковый параметр. library tbudf; uses SysUtils, Math, tbutil in 'tbutil.pas', ib_util in 'ib_util.pas', ibutil in 'ibutil.pas', consts in 'consts.pas'; function udf_CopyMalloc(Str: PChar; var Index, Count: integer): PChar; cdecl; export; begin Result := ib_util_malloc(Length(Str) + 1); StrPCopy(Result, Copy(Str, Index, Count)); End; function udf_Copy(Str: PChar; var Index, Count: integer): PChar; cdecl; export; begin Result := Str; StrPCopy(Str, Copy(Str, Index, Count)); end; procedure udf_StrOfChar(Ret, Ch: PChar; var Count: integer); cdecl; export; begin if (Ch = nil) or (Ch^ = #0) or (Count <= 0) then Ret^ := #0 else StrPCopy(Ret, TBStrOfChar(Ch^, Count)); end; exports udf_CopyMalloc, udf_StrOfChar, udf_Copy; begin isMultithread := True; end. Вот SQL для регистрации declare external function udf_CopyMalloc cstring(254), integer, integer returns cstring(254) Free_it entry_point 'udf_CopyMalloc' module_name 'tbudf'; declare external function udf_Copy cstring(254), integer, integer returns cstring(254) entry_point 'udf_Copy' module_name 'tbudf'; declare external function udf_StrOfChar cstring(254), cstring(254),integer returns parameter 1 entry_point 'udf_StrOfChar' module_name 'tbudf'; Если функции вызываются в нескольких коннектах - сервер падает. Иногда успевает записать в лог ошибку The user defined function: UDF_COPYMALLOC referencing entrypoint: udf_CopyMalloc in module: tbudf caused the fatal exception: Segmentation Fault. The code attempted to access memory without privilege to do so. This exception will cause the Firebird server to terminate abnormally. Иногда нет /opt/firebird/bin/fbguard: /opt/firebird/bin/firebird terminated abnormally (-1) fbserver2 Fri Jun 22 20:19:28 2018 /opt/firebird/bin/fbguard: guardian starting /opt/firebird/bin/firebird fbserver2 Fri Jun 22 20:33:50 2018 /opt/firebird/bin/fbguard: /opt/firebird/bin/firebird terminated abnormally (-1) fbserver2 Fri Jun 22 20:33:50 2018 /opt/firebird/bin/fbguard: guardian starting Во вложении спроект и откомпилированная на CentOS-7 udf Как правильно писать udf для FB 3 ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2018, 19:42 |
|
Firebird 3.0.3 - 3.0.4 SS Linux и udf на FreePascal со строковыми параметрами
|
|||
---|---|---|---|
#18+
Вадим Мещеряковне важно какая функция из трех вызывается И это понятно: ни одна из них неработоспособна в принципе. В образовательных целях попробуйте докопаться до ошибок сами: http://ibphoenix.com/resources/documents/search/doc_36 Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2018, 21:10 |
|
Firebird 3.0.3 - 3.0.4 SS Linux и udf на FreePascal со строковыми параметрами
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakovне важно какая функция из трех вызывается Что с ними не так? Хорошие такие функции. Если откомпилировать под Windows и вызывать в нескольких потоках из тестовой программы, все ОК И Firebird 3.0.3 SS для Windows работает с какой то из них. Две других результат попытки решения этой задачи :) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2018, 21:32 |
|
Firebird 3.0.3 - 3.0.4 SS Linux и udf на FreePascal со строковыми параметрами
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovВ образовательных целях попробуйте докопаться до ошибок сами: http://ibphoenix.com/resources/documents/search/doc_36 Спасибо за ваш ответ. Но по указанной вами ссылке нет информации о том как нужно работать со строками в Pascal что бы Firebird под Linux не падал. P.S. Этот пост - просьба помочь, после того как сами не смогли решить проблему. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2018, 21:39 |
|
Firebird 3.0.3 - 3.0.4 SS Linux и udf на FreePascal со строковыми параметрами
|
|||
---|---|---|---|
#18+
Вадим МещеряковЧто с ними не так? Я же говорю: трассируйте, повышайте квалификацию и знание потрохов FCL. Вадим МещеряковЕсли откомпилировать под Windows и вызывать в нескольких потоках из тестовой программы, все ОК Дай угадаю: и сама библиотека и "тестовая программа" компилируются Дельфями? Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2018, 21:40 |
|
Firebird 3.0.3 - 3.0.4 SS Linux и udf на FreePascal со строковыми параметрами
|
|||
---|---|---|---|
#18+
Вадим МещеряковНо по указанной вами ссылке нет информации о том как нужно работать со строками в Pascal что бы Firebird под Linux не падал. Зато там есть информация как получить и проанализировать core dump после падения. Вадим МещеряковP.S. Этот пост - просьба помочь, после того как сами не смогли решить проблему. А что вы уже делали чтобы её решить? Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2018, 21:46 |
|
Firebird 3.0.3 - 3.0.4 SS Linux и udf на FreePascal со строковыми параметрами
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovЯ же говорю: трассируйте, повышайте квалификацию и знание потрохов FCL. Я взял на себя задачу задать вопрос здесь. Так как тот кому я это поручал сказал, что на русскоязычных форумах только обольют говном а кому это нравится? Он взял на себя задачу в трекер Firebird написать а я сюда. Если вы не способны помочь - зачем тратить тут время? Собственное эго тееребите? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2018, 21:49 |
|
Firebird 3.0.3 - 3.0.4 SS Linux и udf на FreePascal со строковыми параметрами
|
|||
---|---|---|---|
#18+
Вадим МещеряковОн взял на себя задачу в трекер Firebird написать а я сюда. Падает криво написанная UDF, скомпилированная глючным компилятором, а писать об этом, конечно же, нужно в трекер Firebird. Ню-ню... Вадим МещеряковЕсли вы не способны помочь - зачем тратить тут время? Тлеет надежда, что вы начнёте-таки использовать отладчик и поймёте почему PChar никогда нельзя пихать туда, где ожидается string. И в чём разница между PChar, PAnsiChar, PWideChar и PUtf8Char. И что StrPCopy - зло. Ну и ещё пару мелочей типа того, что доверять нельзя никому и первое, что следует сделать - убедиться, что функция получает именно те значения, которые ей передали. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2018, 22:40 |
|
Firebird 3.0.3 - 3.0.4 SS Linux и udf на FreePascal со строковыми параметрами
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovТлеет надежда, что вы начнёте-таки использовать отладчик и поймёте почему PChar никогда нельзя пихать туда, где ожидается string. И в чём разница между PChar, PAnsiChar, Не нужно поднимать собственную самоценку за мой счет. Если есть - то дайте пример исходников, написанных правильным образом. Если знаете как сделать - покажите код. Если видели толковую статью, что я не нашел - дайте ссылку. Если нет ни того ни другого, то просто отойдите в сторонку, уступите место тому специалисту кто знает и может помочь. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2018, 23:15 |
|
Firebird 3.0.3 - 3.0.4 SS Linux и udf на FreePascal со строковыми параметрами
|
|||
---|---|---|---|
#18+
Вадим МещеряковЕсли знаете как сделать - покажите код. Первые две функции следует заменить на встроенный SUBSTRING. Третью - на не менее встроенный RPAD. RTFM Firebird Language Reference. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2018, 23:18 |
|
Firebird 3.0.3 - 3.0.4 SS Linux и udf на FreePascal со строковыми параметрами
|
|||
---|---|---|---|
#18+
Вадим Мещеряков, под тройку лучше писать UDR. Это конечно сложнее зато больше возможностей, да и в 4.0 UDF уже объявлены deprecated. Рискну предположить что первые две функции на фиг не сдались ибо есть аналоги на встроенных функциях. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2018, 23:19 |
|
Firebird 3.0.3 - 3.0.4 SS Linux и udf на FreePascal со строковыми параметрами
|
|||
---|---|---|---|
#18+
Вадим МещеряковЕсли видели толковую статью, что я не нашел - дайте ссылку. http://www.ibphoenix.com/files/Writing-External-Functions.pdf ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2018, 23:23 |
|
Firebird 3.0.3 - 3.0.4 SS Linux и udf на FreePascal со строковыми параметрами
|
|||
---|---|---|---|
#18+
Симонов ДенисРискну предположить что первые две функции на фиг не сдались ибо есть аналоги на встроенных функциях. Денис, вы совершенно правы. Эти функции просто попытка разобраться в проблеме и понять как вернуть строку в результат что бы сервер не падал. Их код основан на примерах с ibase.ru. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2018, 23:27 |
|
Firebird 3.0.3 - 3.0.4 SS Linux и udf на FreePascal со строковыми параметрами
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, Эти функции просто попытка разобраться в проблеме и понять как вернуть строку в результат что бы сервер не падал. Их код основан на примерах с ibase.ru. А нужны такие функции как FormatDateTime, FormatFloat и еще несколько специфических. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2018, 23:45 |
|
Firebird 3.0.3 - 3.0.4 SS Linux и udf на FreePascal со строковыми параметрами
|
|||
---|---|---|---|
#18+
Симонов Денис http://www.ibphoenix.com/files/Writing-External-Functions.pdf Денис, спасибо! Хорошая статья. Завтра попробуем ... |
|||
:
Нравится:
Не нравится:
|
|||
23.06.2018, 00:16 |
|
Firebird 3.0.3 - 3.0.4 SS Linux и udf на FreePascal со строковыми параметрами
|
|||
---|---|---|---|
#18+
Вадим Мещеряков, я писал и проверял пример safeudf (который на ibase.ru) на Дельфи. Что там делает FPC - хрен его знает. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.06.2018, 00:18 |
|
Firebird 3.0.3 - 3.0.4 SS Linux и udf на FreePascal со строковыми параметрами
|
|||
---|---|---|---|
#18+
Вадим Мещеряков, Дмитрий уже намекнул про PChar. Этот тип очень не надёжен в том смысле что в зависимости от версии компилятора там может бять PAnsiChar или PWideChar. Ну и внимательно читаем описание StrPCopy Вадим Мещеряков Ранее под Linux использовали только режим CS и там проблема не возникала возникала просто её не всегда можно заметить потому что пользователи отваливались по одному. А на SS падают сразу все ... |
|||
:
Нравится:
Не нравится:
|
|||
23.06.2018, 00:19 |
|
Firebird 3.0.3 - 3.0.4 SS Linux и udf на FreePascal со строковыми параметрами
|
|||
---|---|---|---|
#18+
kdvЧто там делает FPC - хрен его знает. Обычно он делает хрень. Я не удивлюсь если он игнорирует IsMultithreaded или cdecl, освобождает временную переменную раньше, чем следовало бы, возвращает рандомный мусор по отрицательному смещению из Length или не пишет терминирующий нуль в StrPCopy. Туева хуча граблей заботливо разложена в нём с помощью compiler magic для таких вот... программистов, не умеющих пользоваться отладчиком. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
23.06.2018, 00:27 |
|
Firebird 3.0.3 - 3.0.4 SS Linux и udf на FreePascal со строковыми параметрами
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov для таких вот... программистов, не умеющих пользоваться отладчиком. И опять вы в меня говном бросили. При этом ни из одного вашего комментария к моему вопросу ни крошки ни выжать пользы. Зачем вы все это пишете? В чем прикол? Что у вас там чешется? Обратите внимание на точные и полезные ответы Дмитрия Кузьменко и Дениса Симонова. Именно так и создают сообщество, сообщество которое может помочь и в которое не бояться заходить новые участники. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.06.2018, 01:20 |
|
Firebird 3.0.3 - 3.0.4 SS Linux и udf на FreePascal со строковыми параметрами
|
|||
---|---|---|---|
#18+
Вадим МещеряковПри этом ни из одного вашего комментария к моему вопросу ни крошки ни выжать пользыПри этом он первый (и единственный), кто намекнул Вам о корнях проблемы. О String и PChar, о том, что находится в fpc-шном String... Т.е. о сути проблемы вопроса. P.S. То, что где-то иногда работает - везение. Совет: попробуйте реализовать эти [элементарные] функции "вручную". И проблема всплывет, либо решится сама. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.06.2018, 01:59 |
|
Firebird 3.0.3 - 3.0.4 SS Linux и udf на FreePascal со строковыми параметрами
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovkdvЧто там делает FPC - хрен его знает. Обычно он делает хрень. Я не удивлюсь если он игнорирует IsMultithreaded или cdecl, освобождает временную переменную раньше, чем следовало бы, возвращает рандомный мусор по отрицательному смещению из Length или не пишет терминирующий нуль в StrPCopy. Туева хуча граблей заботливо разложена в нём с помощью compiler magic для таких вот... программистов, не умеющих пользоваться отладчиком. ну у тебя как будто климакс наступил.... - не докапывайся зря до нуббов Вадим МещеряковDimitry Sibiryakov для таких вот... программистов, не умеющих пользоваться отладчиком. И опять вы в меня говном бросили. При этом ни из одного вашего комментария к моему вопросу ни крошки ни выжать пользы. Зачем вы все это пишете? В чем прикол? Что у вас там чешется? Обратите внимание на точные и полезные ответы Дмитрия Кузьменко и Дениса Симонова. Именно так и создают сообщество, сообщество которое может помочь и в которое не бояться заходить новые участники.чтобы было меньше граблей при скрещивании (ну и пробелы в опыте) - используй компилятор вызывающей системы, т.е. твоей версии ФБ для ЮДФ много знаний написать на С не нужно - а седые волосы в редких солнцу местах можно бы поэкономить ... |
|||
:
Нравится:
Не нравится:
|
|||
23.06.2018, 02:28 |
|
Firebird 3.0.3 - 3.0.4 SS Linux и udf на FreePascal со строковыми параметрами
|
|||
---|---|---|---|
#18+
Siemarglчтобы было меньше граблей при скрещивании (ну и пробелы в опыте) - используй компилятор вызывающей системы, т.е. твоей версии ФБ Спасибо за совет. Так и сделаем, перепишем udf под C. Как узнать каким компилятором собран Firebird под linux x64? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.06.2018, 10:10 |
|
Firebird 3.0.3 - 3.0.4 SS Linux и udf на FreePascal со строковыми параметрами
|
|||
---|---|---|---|
#18+
kdvя писал и проверял пример safeudf (который на ibase.ru) на Дельфи. Что там делает FPC - хрен его знает. Я собрал вашу safeudf на FPC и протестировал на Firebird SS с Win 64, Win32, Linux 64 Все работает отлично! Наши функции работают только под Win 32 и Win 64. Вчера под подозрение попала StrPCopy (не случайно в тесте наши три функции используют именно её) но проблема проявлялась только в SS Linux так что стали искать проблему в реализации многопоточности приложения FPC под Linux (Про многопоточночть вы нам рассказали ранее, когда мы делали dll для Win 64 на Delphi) Нашел в статье про разработку многопоточных приложений на FreePascal что нужно делать так uses // Вот оно решение !!!!!! cthreads, // SysUtils, Math, tbutil in 'tbutil.pas', ib_util in 'ib_util.pas', ibutil in 'ibutil.pas', consts in 'consts.pas' Все работает! Из нескольких пользовательских коннектов одновременно вызываю наши функции в SQL запросах с полным переборам записей из больших таблиц (3 000 000 записей). Разумеется, это не меняет принятого нами решения переписать нашу UDF на C. Прошу вас в вашу полезную статью, о том как правильно писать UDF, добавить информацию о StrPCopy и uses cthreads. Может комутто это съэкономит время. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.06.2018, 10:58 |
|
Firebird 3.0.3 - 3.0.4 SS Linux и udf на FreePascal со строковыми параметрами
|
|||
---|---|---|---|
#18+
Провели дополнительные эксперименты StrPCopy - не виновата. Проблема была только в многопоточности FPC. Если в простой код код SafeUdf добавить создание и уничтожение PChar то сервер будет падать. Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Проблему решает только добавление в uses cthreads ... |
|||
:
Нравится:
Не нравится:
|
|||
23.06.2018, 17:14 |
|
Firebird 3.0.3 - 3.0.4 SS Linux и udf на FreePascal со строковыми параметрами
|
|||
---|---|---|---|
#18+
Вадим МещеряковПроблему решает только добавление в uses cthreads Как я и сказал выше: FPC игнорирует IsMultithreaded. Вы уже пошли и написали это ему в трекер? Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
23.06.2018, 17:50 |
|
|
start [/forum/topic.php?fid=40&msg=39664516&tid=1561065]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
93ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
63ms |
get tp. blocked users: |
2ms |
others: | 14ms |
total: | 216ms |
0 / 0 |