|
Не выгружается fbclient.dll (FB 2.5 и 3)
|
|||
---|---|---|---|
#18+
Пользователи стали жаловаться на ошибку "connection shutdown", периодически возникающую при работе с экспертом (и не только). Стал копать и обнаружил, что при каких-то условиях FreeLibrary не выгружает fbclient.dll и все остальное, что она использует. Т.е., имеем такую последовательность: 1. Загружаем fbclient.dll в память процесса. 2. Коннект и работа с базой... 3. Дисконнект. 4. Вызов fb_shutdown. 5. FreeLibrary. После чего fbclient и иже с ним остаются болтаться в памяти процесса, а повторный коннект приводит к упомянутой ошибке. В порядке бреда: есть подозрение, что что-то из загружаемого самой fbclient.dll опять же ее и грузит, увеличивая счетчик ссылок. А потом не выгружает. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2016, 15:49 |
|
Не выгружается fbclient.dll (FB 2.5 и 3)
|
|||
---|---|---|---|
#18+
IBExpert, какая версия fbclient ? В 3.0.0 есть существенные изменения ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2016, 15:55 |
|
Не выгружается fbclient.dll (FB 2.5 и 3)
|
|||
---|---|---|---|
#18+
hvladкакая версия fbclient ? В 3.0.0 есть существенные изменения Я у себя воспроизвел на 3.0.1.32575 с зашифрованной базой (грузится fbcrypt.dll). А у пользователей точно не знаю. Одному ссылку на топик отправил. Если сам не заглянет - уточню. Другой 2.5 использует, точную версию тоже не знаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2016, 16:04 |
|
Не выгружается fbclient.dll (FB 2.5 и 3)
|
|||
---|---|---|---|
#18+
IBExperthvladкакая версия fbclient ? В 3.0.0 есть существенные изменения Я у себя воспроизвел на 3.0.1.32575 с зашифрованной базой (грузится fbcrypt.dll). А у пользователей точно не знаю. Одному ссылку на топик отправил. Если сам не заглянет - уточню. 3.0.0.32483 ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2016, 20:02 |
|
Не выгружается fbclient.dll (FB 2.5 и 3)
|
|||
---|---|---|---|
#18+
IBExpertТ.е., имеем такую последовательность: 1. Загружаем fbclient.dll в память процесса. 2. Коннект и работа с базой... 3. Дисконнект. 4. Вызов fb_shutdown. 5. FreeLibrary.А с какой версии IBE стал вызывать fb_shutdown ? Мой не вызывает, но он не свеж :) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2016, 20:22 |
|
Не выгружается fbclient.dll (FB 2.5 и 3)
|
|||
---|---|---|---|
#18+
hvladА с какой версии IBE стал вызывать fb_shutdown ? Да уж полгода как, в марте месяце соответствующие изменения в коде внесены. А вот проблемы стали возникать совсем недавно. Причем пользователи говорят, что одна и та же софтина на одном компе работает без проблем, а на другом выдает "connection shutdown". Кстати, помнишь, когда обсуждали использование fb_shutdown, я говорил, что возможны проблемы, если коннект создается и прибивается каким-нибудь пользовательским плагином? Так вот, это уже реальность. Пользователь в своей софтине юзает IBO и IBEScript.dll, которые шарят одну и ту же клиентскую библиотеку. Соответственно, если IBEScript.dll создал свой коннект, выполнил скрипт, прибил коннект, вызвал fb_shutdown - все, приплыли... Пока выкрутились загрузкой отдельного экземпляра fbclient с другим путем, но таки проблема уже не умозрительна. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2016, 04:22 |
|
Не выгружается fbclient.dll (FB 2.5 и 3)
|
|||
---|---|---|---|
#18+
IBExpertСоответственно, если IBEScript.dll создал свой коннект, выполнил скрипт, прибил коннект, вызвал fb_shutdown - все, приплыли...fb_shutdown нужно вызывать только перед выгрузкой fbclient, а не после каждого дисконнекта. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2016, 10:12 |
|
Не выгружается fbclient.dll (FB 2.5 и 3)
|
|||
---|---|---|---|
#18+
hvladfb_shutdown нужно вызывать только перед выгрузкой fbclient, а не после каждого дисконнекта. LoadLibrary (application) LoadLibrary (plugin) Connect (plugin) Disconnect (plugin) fb_shutdow (plugin) UnloadLibrary (plugin) Connect (application) ???? Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2016, 11:55 |
|
Не выгружается fbclient.dll (FB 2.5 и 3)
|
|||
---|---|---|---|
#18+
hvladfb_shutdown нужно вызывать только перед выгрузкой fbclient, а не после каждого дисконнекта. Она и вызывается только перед выгрузкой fbclient, когда все скриптовые компоненты освобождаются за ненужностью. В IBEScript по умолчанию это происходит после каждого выполнения скрипта. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2016, 11:56 |
|
Не выгружается fbclient.dll (FB 2.5 и 3)
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovLoadLibrary (application) LoadLibrary (plugin) Connect (plugin) Disconnect (plugin) fb_shutdow (plugin) UnloadLibrary (plugin) Connect (application)Так нельзя ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2016, 12:54 |
|
Не выгружается fbclient.dll (FB 2.5 и 3)
|
|||
---|---|---|---|
#18+
IBExpert, IBEScript.dll когда выгружается экспертом ? Надеюсь не в коде финализации ? Думаю, IBEScript.dll не должен вызывать fb_shutdown. Он сам вызовется при выгрузке fbclient. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2016, 13:22 |
|
Не выгружается fbclient.dll (FB 2.5 и 3)
|
|||
---|---|---|---|
#18+
IBExpertВ порядке бреда: есть подозрение, что что-то из загружаемого самой fbclient.dll опять же ее и грузит, увеличивая счетчик ссылок. А потом не выгружает.Это не бред, это так и есть. И fb_shutdown как раз обеспечивает принудительную выгрузку всего остального, что не даёт отпустить fbclient.dll. Но вызывать его нужно до завершения приложения. Т.е., например, в секции финализации это делать уже поздно. Ну и нужно помнить, что после fb_shutdown никакая работа с fbclient.dll уже не возможна (иначе какой же это shutdown). ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2016, 13:27 |
|
Не выгружается fbclient.dll (FB 2.5 и 3)
|
|||
---|---|---|---|
#18+
hvladIBEScript.dll когда выгружается экспертом ? Надеюсь не в коде финализации? Думаю, IBEScript.dll не должен вызывать fb_shutdown. Он сам вызовется при выгрузке fbclient. IBEScript не используется экспертом. Читай выше: у пользователя какое-то свое приложение на IBO, вдобавок для выполнения скриптов он из того же приложения он использует IBEScript.dll. Как уж он там загружает/выгружает, в каком порядке - мне это неведомо, да и неважно: он имеет право выгружать IBEScript.dll в любой момент. Подозреваю, что IBO тоже дергает fb_shutdown тогда, когда считает нужным. Почему IBEScript.dll не должен вызывать fb_shutdown? Он вовсе не обязан использовать ту же клиентскую либу, что и хост-приложение. Может использовать любую заданную, да хоть пять разных одновременно. И кто будет fb_shutdown дергать? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2016, 13:36 |
|
Не выгружается fbclient.dll (FB 2.5 и 3)
|
|||
---|---|---|---|
#18+
hvladIBExpertВ порядке бреда: есть подозрение, что что-то из загружаемого самой fbclient.dll опять же ее и грузит, увеличивая счетчик ссылок. А потом не выгружает.Это не бред, это так и есть. И fb_shutdown как раз обеспечивает принудительную выгрузку всего остального, что не даёт отпустить fbclient.dll. Но вызывать его нужно до завершения приложения. Т.е., например, в секции финализации это делать уже поздно. Ну и нужно помнить, что после fb_shutdown никакая работа с fbclient.dll уже не возможна (иначе какой же это shutdown). Ну так об этом и речь: 1. Проблема воспроизводится при коннекте/дисконнекте в эксперте (embedded), нет там никакого завершения приложения. 2. fbclient не выгружается, хотя должна. 3. Следующая попытка коннекта выдает "connection shutdown". Что совершенно естественно, раз она не выгрузилась. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2016, 13:41 |
|
Не выгружается fbclient.dll (FB 2.5 и 3)
|
|||
---|---|---|---|
#18+
hvladТак нельзя А как тогда? Плагин не имеет ни малейшего понятия что и как делает приложение. А невызов fb_shutdown перед выгрузкой библиотеки карается крашем, документированным в многочисленных топиках этого форума. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2016, 14:06 |
|
Не выгружается fbclient.dll (FB 2.5 и 3)
|
|||
---|---|---|---|
#18+
IBExpertПочему IBEScript.dll не должен вызывать fb_shutdown?fb_shutdown вызывается перед последним вызовом FreeLibrary ведущим к выгрузке fbclient.dll fb_shutdown нужен для того, чтобы - корректно закрыть всё то, что приложение не закрыло за собой - избежать зависания при завершении приложения - отпустить другие модули, которые могут держать ссылки на сам fbclient - при явной выгрузке fbclient'а. Но тут выгружающий код должен иметь гарантию, что его вызов FreeLibrary - последний Т.к. IBEScript.dll - не приложение, не знает о том, используется ли fbclient самим приложением или другими модулями, то он не должен вызывать fb_shutdown. Итого: fb_shutdown критически важен, когда - приложение статически слинковано с fbclient.dll - приложение явно загружает\выгружает fbclient.dll и ему нужно, чтобы fbclient.dll был реально выгружен В остальных случаях fb_shutdown можно не вызывать. В 3.0 механизм выгрузки fbclient.dll был доработан так, чтобы меньше зависеть от вызова fb_shutdown и не падать\не вешаться в тех случаях, когда при завершении приложения остались не очищенные ресурсы, а само приложение не вызвало fb_shutdown вовремя. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2016, 16:15 |
|
Не выгружается fbclient.dll (FB 2.5 и 3)
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovА невызов fb_shutdown перед выгрузкой библиотеки карается крашем, документированным в многочисленных топиках этого форума.Не для 3.0 ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2016, 16:15 |
|
Не выгружается fbclient.dll (FB 2.5 и 3)
|
|||
---|---|---|---|
#18+
IBExpertНу так об этом и речь: 1. Проблема воспроизводится при коннекте/дисконнекте в эксперте (embedded), нет там никакого завершения приложения. 2. fbclient не выгружается, хотя должна. Сдаётся мне, реальный сценарий чуть сложнее вышеописанного ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2016, 16:16 |
|
Не выгружается fbclient.dll (FB 2.5 и 3)
|
|||
---|---|---|---|
#18+
hvladТ.к. IBEScript.dll - не приложение, не знает о том, используется ли fbclient самим приложением или другими модулями, то он не должен вызывать fb_shutdown. Тогда в 2.5 имеем крэш. Ну, в общем, понятно, что с этим ничего уже не сделать, и надо просто объезжать это на кривой козе. hvladСдаётся мне, реальный сценарий чуть сложнее вышеописанного В каком смысле? Само собой, там не просто коннект/дисконнект, а выполнение кучки запросов между ними. Но перед коннектом вызывается LoadLibrary, а после дисконнекта - FreeLibrary. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2016, 17:07 |
|
Не выгружается fbclient.dll (FB 2.5 и 3)
|
|||
---|---|---|---|
#18+
hvladТ.к. IBEScript.dll - не приложение, не знает о том, используется ли fbclient самим приложением или другими модулями Внезапно - Google! https://social.msdn.microsoft.com/Forums/en-US/9b391db0-6429-4f63-88c3-a8b010f76da7/dll-reference-counter?forum=vcgeneral http://chee-yang.blogspot.ru/2008/12/windows-get-reference-count-of-dll-in.html PS. Но по хорошему, конечно, надо было к fb_shutdown сделать парный fb_init - и пусть он ничего не делает кроме увеличения счётчика, зато можно бы было просто вызывать fb_shutdown каждый раз при выгрузке, и не опасаться, что она не последняя ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2016, 14:54 |
|
Не выгружается fbclient.dll (FB 2.5 и 3)
|
|||
---|---|---|---|
#18+
AriochPS. Но по хорошему, конечно, надо было к fb_shutdown сделать парный fb_init - и пусть он ничего не делает кроме увеличения счётчика, зато можно бы было просто вызывать fb_shutdown каждый раз при выгрузке, и не опасаться, что она не последняя Толку-то, если fbclient не выгружается из памяти. 2Влад: А не проще ли (и правильнее) при вызове каждой функции, требующей дополнительной инициализации клиента, проверять, в каком состоянии находится fbclient и выполнять или не выполнять инициализацию? Т.е., завести некий флаг инициализированного состояния, который сбрасывается вызовом fb_shutdown. И каждый вызов функции клиента извне начинать с проверки этого флага. Если он сброшен - выполнять инициализацию и затем собственно функцию. Тогда fb_shutdown можно будет вызывать не парясь собственным подсчетом ссылок. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2016, 06:01 |
|
Не выгружается fbclient.dll (FB 2.5 и 3)
|
|||
---|---|---|---|
#18+
IBExpert, ИМХО, хорошее решение! И еще lazy инициализацию прикрутить при вызове функции, требующей инициализации библиотеки. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2016, 09:02 |
|
Не выгружается fbclient.dll (FB 2.5 и 3)
|
|||
---|---|---|---|
#18+
IBExpertА не проще ли (и правильнее) при вызове каждой функции, требующей дополнительной инициализации клиента, проверять, в каком состоянии находится fbclient и выполнять или не выполнять инициализацию?Это практически не возможно - примерно как провернуть фарш в обратную сторону ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2016, 10:58 |
|
Не выгружается fbclient.dll (FB 2.5 и 3)
|
|||
---|---|---|---|
#18+
hvladIBExpertНу так об этом и речь: 1. Проблема воспроизводится при коннекте/дисконнекте в эксперте (embedded), нет там никакого завершения приложения. 2. fbclient не выгружается, хотя должна. Сдаётся мне, реальный сценарий чуть сложнее вышеописанногоОбновил IBE до 2016.10.21.1 Сам IBE у меня использует FB embedded 2.5.3 для user database. Делаю embedded коннект к БД с помощью FB 3.0.1 Дисконнект - fbclient 3.0.1 выгружен, а также engine12 и прочее. Осталось только ICU и ibutil. Снова коннект - ок Дисконнект - fbclient 3.0.1 выгружен, а также engine12 и прочее. Осталось только ICU и ibutil. И т.д. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2016, 11:14 |
|
Не выгружается fbclient.dll (FB 2.5 и 3)
|
|||
---|---|---|---|
#18+
hvlad, У меня на одном компьютере база и embedded 3.0.1 в том же каталоге есть проблема, копирую каталог на другой компьютер нет проблем. Думаю зависит еще и от точных версий дополнительных dll от которых зависит fbclient.dll ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2016, 11:49 |
|
|
start [/forum/topic.php?fid=40&msg=39332810&tid=1561898]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
43ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
59ms |
get tp. blocked users: |
1ms |
others: | 16ms |
total: | 164ms |
0 / 0 |