Notes |
|
|
Учитывая наличие TGlobalBerkeleyDBHelper в потерянных объектах, рискну предположить, что это подвисшее обращение к базе беркли осталось висеть.
Проверяйте свой кэш. |
|
|
(0015624)
|
zed
|
20-04-2015 17:21
|
|
>Учитывая наличие TGlobalBerkeleyDBHelper
Это ни о чём не говорит. Вот если бы там были TBerkeleyDBEnv или TBerkeleyDB, тогда другое дело. А так, тупо GlobalState не освободился и все порождённые им интерфейсы остались в памяти. Может там EmbeddedWB подвис - в отличии от всех остальных объектов, у него отсылка к Finalization и вот там могло случиться что-нибудь нехорошее. |
|
|
|
> А так, тупо GlobalState не освободился и все порождённые им интерфейсы остались в памяти.
Не, такого не может быть так как GlobalState удаляется простым Free в основном потоке.
Это подвис поток, который держал ссылки на все эти объекты. Так что EmbeddedWB не подходит. |
|
|
|
Повторяется только на кеше беркли. На всех кешах беркли, что у меня есть. Некоторые из них проверил - целые. Поэтому видимо дело не в этом. |
|
|
(0015678)
|
zed
|
22-04-2015 19:10
|
|
> Некоторые из них проверил
Проверять надо тот, который открывается в программе (какую карту просматриваете). |
|
|
|
zed, вы не поняли, открывал разные карты. Все, которые в беркли, при закрытии вылетали с той или иной периодичностью. Эти же кеши проверял sdb_util - все ок. |
|
|
(0015680)
|
zed
|
22-04-2015 20:27
|
|
Попробуйте вот на этой версии: https://yadi.sk/d/5OxBOY_ZgB4VT
Когда баг воспроизведётся, скиньте мне ещё sdb.log (появится рядом с exe) и конфиги кэшей которые открывались (файлы DB_CONFIG из папки env в кэше). |
|
|
(0015681)
|
zed
|
22-04-2015 20:34
|
|
О, там оказывается есть один лог с AV, а не только утечки.
И ещё, судя по логам, там очень маленькое время UpTime, а по этому поводу у нас уже был тикет. |
|
|
|
Логи и DB_CONFIG (он везде одинаковый) добавил. По всей видимости, действительно вылет почти всегда происходит, если закрыть программу сразу после запуска. |
|
|
|
Похоже это полный дубликат бага 0002050
С авешкой тоже можно побороться, но честно говоря лень. Можно во всех функциях которые вызываются в отдельном потоке (OnPrepareTileMatrix и тд.) в начале запоминать интерфейсную ссылку на себя в локальной переменной. Это будет гарантировать что деструктор не вызовется до завершения функции.
Еще можно передавать в конструктор TBackgroundTask интерфейсную ссылку, но сохранять ее в указателе, что бы она работала как слабая ссылка, и вызывать _AddRef в методе TBackgroundTask.Execute перед вызовом рабочей функции и _Release после. |
|