Lazarus, утечка бекенда GTK2 в slackware

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Lazarus, утечка бекенда GTK2 в slackware

Сообщение sunjob » 12.09.2024 20:43:40

некое приложение, не особо-тяжелое, работает без проблем (как таковых: не падает, не глючит итд)
есть особенность: бинарники, собранные с отладкой в GTK2 кажут утечку
остальные (qt4/5) - все ОК.

есть мнение, что "текет" именно в slackware.
(проверял на обоих 14.2 и 15.0, карент еще не трогал)

протестировал на ubuntu 22.x/23.x - там все нормально с "этим"
причем, бинарники, собранные в slackware - не текут в ubuntu

ИТАК, как промежуточный итог считаем, что:
- текут системные библиотеки у slackware
- текут именно gtk2

рабочий/develop дистр меняться не будет.

хотелось-бы разобраться чуть более подробно что/где/почему
и что-бы по возможности "обходить эти грабли".

советы/идеи/пендили?!

исходные:
Код: Выделить всё
- Lazarus   3.2.0/3.4.0 (от версии не зависит)
- backend   gtk2/qt4/qt5
- fpc       3.2.2
- slackware 14.2/15.0
- qt4-4.8.7
- qt5-5.12.8
- gtk+2.24.31 (slackware-14.2) - текет
- gtk+2.24.33 (slackware-15.0) - текет
- gtk2-engines-2.21.0 (slackware)
- gtk+2.24.33 (ubuntu 22.04.4) - не текет
- gtk2-engines-2.20.2 (ubuntu 22.04.4)


в утечках "указывались" 2е мои функции,
Код: Выделить всё
- parser.check ()
- form_icon_set()


реакция на "отключение" вызовов

Код: Выделить всё
//
// form_icon_set() to on
//
3511 memory blocks allocated : 2120433/2126608
3509 memory blocks freed     : 2120209/2126384
2 unfreed memory blocks : 224
True heap size : 1933312
True free heap : 1932608
Should be : 1932704
Call trace for block $00007F05DDD20FC0 size 112
  $00000000004662DF  FormCreate,  line 438 of unit1.pas -> form_icon_set()
  $000000000044F9B6  DOCREATE,    line 922 of include/customform.inc
Call trace for block $00007F05DDD1EEC0 size 112
  $00000000005E9FD4  INITKEYBOARDTABLES,  line 3482 of gtk2/gtk2proc.inc
  $000000000041F046  $main,       line  33 of prj1.lpr  -> Application.Initialize()
  $000000000041EF60  $main,       line  22 of prj1.lpr  -> parser.check()

//
// form_icon_set() to off
//
3445 memory blocks allocated : 2111409/2117584
3443 memory blocks freed     : 2111185/2117360
2 unfreed memory blocks : 224
True heap size : 1933312
True free heap : 1932608
Should be : 1932704
Call trace for block $00007FF1CFEA3FC0 size 112
Call trace for block $00007FF1CFEA1EC0 size 112
  $00000000005E9E64  INITKEYBOARDTABLES,  line 3482 of gtk2/gtk2proc.inc
  $000000000041F046  $main,  line 33 of prj1.lpr -> Application.Initialize()
  $000000000041EF60  $main,  line 22 of prj1.lpr -> parser.check()

//
// parser.check () to off
// form_icon_set() to off
//
3396 memory blocks allocated : 2102397/2108336
3394 memory blocks freed     : 2102173/2108112
2 unfreed memory blocks : 224
True heap size : 1900544
True free heap : 1899840
Should be : 1899936
Call trace for block $00007F395BF1BFC0 size 112
Call trace for block $00007F395BF19EC0 size 112
  $00000000005E9E04  INITKEYBOARDTABLES,  line 3482 of gtk2/gtk2proc.inc
  $000000000041EFED  $main,               line   33 of prj1.lpr -> Application.Initialize()


### UPDATE 1 ###
URL1

Код: Выделить всё
valgrind --tool=memcheck --leak-check=full --log-file=log.txt --show-reachable=yes --num-callers=50 ./xxx

main$ grep leak log.txt -> void
main$ grep error log.txt
==20136== Memcheck, a memory error detector
==20136==    by 0x52C3674: gdk_error_trap_push (in /usr/lib64/libgdk-x11-2.0.so.0.2400.31)
==20136==    by 0x52C3681: gdk_error_trap_push (in /usr/lib64/libgdk-x11-2.0.so.0.2400.31)
==20136==    by 0x505F626: _dlerror_run (in /lib64/libdl-2.23.so)
==20136==    by 0x4010503: _dl_catch_error (in /lib64/ld-2.23.so)
==20136==    by 0x4010503: _dl_catch_error (in /lib64/ld-2.23.so)
==20136==    by 0x505F570: _dlerror_run (in /lib64/libdl-2.23.so)
==20136==    by 0x4010503: _dl_catch_error (in /lib64/ld-2.23.so)
==20136==    by 0x4010503: _dl_catch_error (in /lib64/ld-2.23.so)
==20136==    by 0x505F570: _dlerror_run (in /lib64/libdl-2.23.so)
==20136==    by 0x4010503: _dl_catch_error (in /lib64/ld-2.23.so)
==20136==    by 0x4010503: _dl_catch_error (in /lib64/ld-2.23.so)
==20136==    by 0x505F570: _dlerror_run (in /lib64/libdl-2.23.so)
==20136==    by 0x4010503: _dl_catch_error (in /lib64/ld-2.23.so)
==20136==    by 0x4010503: _dl_catch_error (in /lib64/ld-2.23.so)
==20136==    by 0x505F570: _dlerror_run (in /lib64/libdl-2.23.so)
==20136== For lists of detected and suppressed errors, rerun with: -s
==20136== ERROR SUMMARY: 36 errors from 36 contexts (suppressed: 0 from 0)

### UPDATE 2 ###
ой-вей! проявилась еще более интересная особенность:
- собираем "пустой проект" - ни чего не текет.
- запускаем "дырявый проект" (*) - в какой-то момент начинает течь.
- запускаем "пустой проект" - аналогично, начинает течь.

(*) - дело в том, что "сообщение об утечке" может появиться не сразу (как там в голове у "него" шарахнет), но если появилость - то всЁ, мы потекли...
дополнительно: замечено что из-за virtual-box иногда приходиться перегружать систему (начинают проявляться всякие хреньки в работе всей системы)

промежуточный ИТОГ:
- а собственно, подтверждает пред. выкладки: текет GTK2 в той или иной степени, причем с фишками и плюшками :D
Аватара пользователя
sunjob
постоялец
 
Сообщения: 156
Зарегистрирован: 12.01.2011 15:19:54

Re: Lazarus, утечка бекенда GTK2 в slackware

Сообщение Alexander » 14.09.2024 08:25:34

Надо сообщить создателям slackware, описав как багрепорт.
Аватара пользователя
Alexander
энтузиаст
 
Сообщения: 771
Зарегистрирован: 18.12.2005 19:10:00
Откуда: оттуда

Re: Lazarus, утечка бекенда GTK2 в slackware

Сообщение Sergei I. Gorelkin » 14.09.2024 13:59:55

Логи как бы намекают, что утечка происходит из-за невозможности загрузить какую-то разделяемую библиотеку. Какую именно - можно попытаться узнать с помощью strace. А так как gtk грузит чертову тонну всяких своих engine, это может быть ошибка конфигурации или отсутствующий пакет (a у Slackware менеджер пакетов автоматически зависимости не ставит).
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1405
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Lazarus, утечка бекенда GTK2 в slackware

Сообщение sunjob » 15.09.2024 04:18:44

Sergei I. Gorelkin писал(а):из-за невозможности загрузить

м.б. все-таки из-за "ошибки загрузки"?! приложение работает вообщем-то без проблем (если-бы не периодический выхлоп об "утечках", то и вопросов-бы не было)

gtk грузит чертову тонну ... ошибка конфигурации или отсутствующий пакет (a у Slackware...

думаю проблема не тут по многим причинам (система стоковая, пакеты установлены все 100%, что-то дособиралось/доставлялось, но базисные пакеты не менялись, прочие gtk2-приложения работают вообще без вопросов)

Alexander писал(а):сообщить создателям slackware

создателей - всего один, Patrick J. Volkerding.
старый я бодаться с патриком и... тем более с алиеном, вредный он (на ск. я знаю, оч.много пакетов собирает сейчас он) :D

зы спасибо, буду посмотреть как доберусь
Аватара пользователя
sunjob
постоялец
 
Сообщения: 156
Зарегистрирован: 12.01.2011 15:19:54

Re: Lazarus, утечка бекенда GTK2 в slackware

Сообщение Sergei I. Gorelkin » 15.09.2024 16:56:14

sunjob писал(а):м.б. все-таки из-за "ошибки загрузки"?! приложение работает вообщем-то без проблем (если-бы не периодический выхлоп об "утечках", то и вопросов-бы не было)

Речь о какой-то второстепенной функциональности, отсутствие которой сразу не заметно. Ну например, модуль IME для китайского языка. А может даже и не второстепенной - в Linux по умолчанию "ленивое" связывание, т.е. функции в .so ищутся только в момент первого вызова.
GTK устанавливает обработчик ошибок (gdk_error_trap_push), в котором собственно и происходит утечка. Наличие обработчика говорит о том, что авторы либо предусмотрели возможность ошибки в конкретном месте и хотят красиво ее обработать, либо просто ставят обработчик на все случаи жизни. Возможно, что обработчик пишет что-то в какой-то лог. Но это следствие, а сам этот обработчик вызывается из загрузчика (все эти _dl_catch_error), что говорит об источнике ошибок. Возможно, причина не в отсутствии библиотеки как таковой, а в отсутствии в ней нужной функции.

sunjob писал(а):думаю проблема не тут по многим причинам (система стоковая, пакеты установлены все 100%, что-то дособиралось/доставлялось, но базисные пакеты не менялись, прочие gtk2-приложения работают вообще без вопросов)

Ты же не проверял эти прочие gtk2 приложения на предмет утечек? :)
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1405
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 18

Рейтинг@Mail.ru