Re: new / delete в UDF
Vladimir ... С сетевым коннектом ошибка проявляется по-другому, и isql при этом не падает. SQL SELECT TestInsert(333) from RDB$Database; TESTINSERT Statement failed, SQLCODE = -902 Error reading data from the connection. SQL quit; Это действительно 2.1.3 ? Не 2.0.х ? В firebird.log на сервере есть что-то ? Есть возможность проверить 2.5 ? -- Хорсун Влад
Re: new / delete в UDF
Вариант 3. Пытаюсь перегрузить операторы new и delete. Попробуй в этом варианте сделать операторы инлайновыми или разместить их в неименованном пространстве имён. Т. е. скрыть от линкера. Пробовал объявить свои перегруженные операторы как inline - все равно в udf управление на них не передается. Похоже, линкер/загрузчик где-то путается с разрешением символов и вместо rtl-ных new/delete подставляет какие-то левые. Тут немного непонятно. Если в моей udf используются new/delete от firebird, то почему они приводят к ошибке? Может быть, дело в другом? Например, такая ситуация. Firebird работает, что-то размещает своим new. Потом загружается моя библиотека, и firebird с этого момента переключается на загруженные с ней new, delete из libstdc++ При этом использует чужой delete для чего-то, размещенного ранее своим new. С уважением, Владимир.
Re: new / delete в UDF
Vladimir ... Похоже, линкер/загрузчик где-то путается с разрешением символов и вместо rtl-ных new/delete подставляет какие-то левые. Тут немного непонятно. Если в моей udf используются new/delete от firebird, то почему они приводят к ошибке? Может быть, дело в другом? Например, такая ситуация. Firebird работает, что-то размещает своим new. Потом загружается моя библиотека, и firebird с этого момента переключается на загруженные с ней new, delete из libstdc++ При этом использует чужой delete для чего-то, размещенного ранее своим new. Именно это и было моим первым предположением. Только оно касалось экспортированных new\delete из UDF. -- Хорсун Влад
Re: new / delete в UDF
Проблема в том, что по умолчанию линкер gcc экспортирует все ф-ции. Соответственно, UDF цепляет delete движка (embedded коннект), или isql. Движок в 2.5 вроде как уже поправили на этот счёт, но утилиты по прежнему всё выставляют наружу. Но тогда ведь и new бы цеплялась? Или в чем-то условия для этих двух операторов отличаются? Моя громоздкая UDF заработала. Еще раз большое спасибо за решение. С уважением, Владимир.
Re: new / delete в UDF
Vladimir ... Спасибо за совет. Очень было похоже, что это может помочь, но никакие опции редактора не изменили ситуацию. Какого-такого редактора ? Пробовал --no-export-dynamic --exclude-libs, никакого эффекта. Какая версия Firebird ? Есть возможность пройтись отладчиком по коду UDF и посмотреть - что за delete он вызывает? -- Хорсун Влад
Re: new / delete в UDF
Vladimir ... А каким образом проверяется работоспособность UDF ? Запросы выполняются в isql с локальным коннектом ? Сетевой коннект не пробовал ? -- Хорсун Влад
Re: new / delete в UDF
Да, все в isql с локальным коннектом. Имеет смысл попробовать сетевой коннект? С уважением, Владимир.
Re: new / delete в UDF
Vladimir ... Да, все в isql с локальным коннектом. Имеет смысл попробовать сетевой коннект? Да -- Хорсун Влад
Re: new / delete в UDF
28.11.2011 18:27, Vladimir пишет: Вариант 3. Пытаюсь перегрузить операторы new и delete. Попробуй в этом варианте сделать операторы инлайновыми или разместить их в неименованном пространстве имён. Т. е. скрыть от линкера. Похоже, линкер/загрузчик где-то путается с разрешением символов и вместо rtl-ных new/delete подставляет какие-то левые. Попробуй запустить под strace и/или gdb. -- Александр Замараев
Re: new / delete в UDF
On Nov 18, 11:08 am, Khorsun Vlad hv...@optima.com.ua wrote: Vladimir ... ! Linux UDF, gcc, : long* aTestItem = new long; delete aTestItem; Segmentation fault delete. , .so ӣ . --
Re: new / delete в UDF
Спасибо за совет. Очень было похоже, что это может помочь, но никакие опции редактора не изменили ситуацию. Пробовал --no-export-dynamic --exclude-libs, никакого эффекта. С уважением, Владимир.
Re: new / delete в UDF
Vladimir ... Здравствуйте! При попытке в Linux использовать UDF, собранную в gcc, столкнулся со следующим: long* aTestItem = new long; delete aTestItem; вызывает ошибку Segmentation fault на операторе delete. Насколько я помню, нужно явно сказать линкеру не экспортировать из .so всё подряд. -- Хорсун Влад