Dear Maintainer, hello Anthony DeRobertis,
I just tried to reproduce this issue in a buster amd64
qemu VM with a uptodate buster at 2018-09-27.
On Wed, 26 Sep 2018 13:42:01 -0400 Anthony DeRobertis <[email protected]>
wrote:
Package: clementine
Version: 1.3.1+git565-gd20c2244a+dfsg-1
Severity: normal
I'm not sure if this is a Clementine bug or a Gstreamer bug, but I've
noticed that when I leave Clementine running for a bit, its memory usage
grows massive (many GiB). I'm playing almost exlusively FLAC files,
which all have (fairly large) embedded artwork, multiple images per
file.
I used heaptrack to attempt to track down where the memory leak is. This
is after only a day or two of use:
MEMORY LEAKS
857.27MB leaked over 2418654 calls from
g_malloc
in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0
826.58MB leaked over 1941 calls from:
g_slice_alloc
in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0
0x7fe9ca6e49d0
in /usr/lib/x86_64-linux-gnu/libgstreamer-1.0.so.0
gst_buffer_new_allocate
in /usr/lib/x86_64-linux-gnu/libgstreamer-1.0.so.0
gst_tag_image_data_to_image_sample
in /usr/lib/x86_64-linux-gnu/libgsttag-1.0.so.0
gst_tag_list_add_id3_image
in /usr/lib/x86_64-linux-gnu/libgsttag-1.0.so.0
0x7fe994f1ca1f
in /usr/lib/x86_64-linux-gnu/gstreamer-1.0/libgstaudioparsers.so
0x7fe9ca8116b1
in /usr/lib/x86_64-linux-gnu/libgstbase-1.0.so.0
0x7fe9ca811d8e
in /usr/lib/x86_64-linux-gnu/libgstbase-1.0.so.0
0x7fe9ca815301
in /usr/lib/x86_64-linux-gnu/libgstbase-1.0.so.0
0x7fe9ca75df40
in /usr/lib/x86_64-linux-gnu/libgstreamer-1.0.so.0
0x7fe9ca8ddad2
in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0
0x7fe9ca8dd134
in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0
start_thread
in /lib/x86_64-linux-gnu/libpthread.so.0
__clone
in /lib/x86_64-linux-gnu/libc.so.6
I could just get a backtrace with debug symbols that
looks very similar to Anthonys call stack from heaptrack:
(gdb) bt
#0 0x00007ffff5de3640 in g_malloc (n_bytes=n_bytes@entry=4079355) at
../../../../glib/gmem.c:95
#1 0x00007ffff5dfb5b3 in g_slice_alloc (mem_size=mem_size@entry=4079355) at
../../../../glib/gslice.c:1024
#2 0x00007ffff5c0d9d1 in _sysmem_new_block (flags=(unknown: 0),
maxsize=4079211, align=7, offset=0, size=4079204) at gstallocator.c:417
#3 0x00007ffff5c190c2 in gst_buffer_new_allocate
(allocator=allocator@entry=0x0, size=size@entry=4079204,
params=params@entry=0x0) at gstbuffer.c:839
#4 0x00007ffff6c61412 in gst_tag_image_data_to_image_sample (image_data=0x7fff600380d1
"\377\330\377", <incomplete sequence \340>, image_data_len=4079203,
image_type=GST_TAG_IMAGE_TYPE_BACK_COVER) at tags.c:528
#5 0x00007ffff6c513b3 in gst_tag_list_add_id3_image (tag_list=0x7fff60003140,
image_data=<optimized out>, image_data_len=image_data_len@entry=4079203,
id3_picture_type=<optimized out>) at gstid3tag.c:379
#6 0x00007fffa0065b00 in gst_flac_parse_handle_picture (buffer=0x7fff5c02f6d0,
flacparse=0x7fff5c049af0 [GstFlacParse]) at
/usr/include/gstreamer-1.0/gst/base/gstbytereader.h:651
#7 0x00007fffa0065b00 in gst_flac_parse_handle_block_type
(sbuffer=0x7fff5c02f6d0, type=6, flacparse=0x7fff5c049af0 [GstFlacParse]) at
gstflacparse.c:1520
#8 0x00007fffa0065b00 in gst_flac_parse_parse_frame (frame=0x7fff600030f0,
frame=0x7fff600030f0, size=4079268, parse=0x7fff5c049af0 [GstFlacParse]) at
gstflacparse.c:1574
#9 0x00007fffa0065b00 in gst_flac_parse_handle_frame (parse=0x7fff5c049af0
[GstFlacParse], frame=0x7fff600030f0, skipsize=<optimized out>) at
gstflacparse.c:870
#10 0x00007ffff5d3a6b2 in gst_base_parse_handle_buffer
(parse=parse@entry=0x7fff5c049af0 [GstFlacParse], buffer=<optimized out>,
skip=skip@entry=0x7fff737e075c, flushed=flushed@entry=0x7fff737e0758) at
gstbaseparse.c:2160
#11 0x00007ffff5d3ad8f in gst_base_parse_scan_frame (parse=parse@entry=0x7fff5c049af0
[GstFlacParse], klass=<optimized out>) at gstbaseparse.c:3464
#12 0x00007ffff5d3e302 in gst_base_parse_loop (pad=<optimized out>) at
gstbaseparse.c:3543
#13 0x00007ffff5c86f41 in gst_task_func (task=0x7fff78042830 [GstTask]) at
gsttask.c:332
#14 0x00007ffff5e06ad3 in g_thread_pool_thread_proxy (data=<optimized out>) at
../../../../glib/gthreadpool.c:307
#15 0x00007ffff5e06135 in g_thread_proxy (data=0x7fff5c045b70) at
../../../../glib/gthread.c:784
#16 0x00007ffff61aaf2a in start_thread (arg=0x7fff737e1700) at
pthread_create.c:463
#17 0x00007ffff3f09edf in clone () at
../sysdeps/unix/sysv/linux/x86_64/clone.S:95
(For some reason heaptracks locations 3 last digits are one lower than gdbs?)
Unfortunately I never received a heaptrack report that
shows this allocation as leaked on my test system.
Was this a different heaptrack version or I just used it wrong?
Also a valgrind run did not show a leak at this location.
I have no idea why that backtrace doesn't show any Clementine code in
it. I tried installing some more -dbg/-dbgsym packages, but maybe I had
to do it before starting Clementine.
Heaptrack may be not prepared to use the debug information
delivered by the dbg packages. I also got no stacks from heaptrack
files record while dbgsym packages were installed.
Note this is the main clementine process, not the tagreader processes:
$ ps u | sed -e '1p;/[c]lementine/!d'
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
anthony 15944 0.5 6.6 4407604 1650488 pts/4 Sl+ Sep24 16:30 clementine
anthony 15956 0.0 0.1 276992 37368 pts/4 Sl+ Sep24 0:20
/usr/bin/clementine-tagreader /tmp/clementine_-631367825
anthony 15958 0.0 0.1 276992 39392 pts/4 Sl+ Sep24 0:20
/usr/bin/clementine-tagreader /tmp/clementine_-792921086
anthony 15959 0.0 0.1 276992 37676 pts/4 Sl+ Sep24 0:20
/usr/bin/clementine-tagreader /tmp/clementine_-1767394138
anthony 15963 0.0 0.1 276988 37340 pts/4 Sl+ Sep24 0:20
/usr/bin/clementine-tagreader /tmp/clementine_-1468073315
While playing I could not see an increase of memory usage percentage in htop.
Following is the location where the memory allocated in given
stack was freed in my test system:
(gdb) bt
#0 0x00007ffff5de3720 in g_free (mem=0x7fff6041bf50) at
../../../../glib/gmem.c:193
#1 0x00007ffff5c4bb88 in _gst_memory_free (mem=0x7fff6041bf50) at
gstmemory.c:97
#2 0x00007ffff5c1794a in gst_memory_unref (memory=<optimized out>) at
../gst/gstmemory.h:345
#3 0x00007ffff5c1794a in _gst_buffer_free (buffer=0x7fff5c02fd30) at
gstbuffer.c:749
#4 0x00007ffff5c76713 in gst_buffer_unref (buf=<optimized out>) at
../gst/gstbuffer.h:442
#5 0x00007ffff5c76713 in _gst_sample_free (sample=0x7fffd41290f0) at
gstsample.c:82
#6 0x00007ffff5ee45e0 in g_value_unset (value=value@entry=0x7fff6c005b18) at
../../../../gobject/gvalue.c:275
#7 0x00007ffff5c79cdc in gst_structure_free (structure=0x7fffd41091a0) at
gststructure.c:385
#8 0x00007ffff5c8149d in __gst_tag_list_free (list=0x7fffd411f9e0) at
gsttaglist.c:720
#9 0x00007ffff5ee45e0 in g_value_unset (value=value@entry=0x7fff6c0042b8) at
../../../../gobject/gvalue.c:275
#10 0x00007ffff5c79cdc in gst_structure_free (structure=0x7fffd4120580) at
gststructure.c:385
#11 0x00007ffff5c4746d in _gst_message_free (message=0x7fff78043590) at
gstmessage.c:218
#12 0x00007ffff5dd9e5d in g_list_foreach (list=<optimized out>,
list@entry=0x555556f4d340 = {...}, func=0x7ffff5c1eb60 <gst_message_unref>,
user_data=user_data@entry=0x0) at ../../../../glib/glist.c:1013
#13 0x00007ffff5dd9e8b in g_list_free_full (list=0x555556f4d340 = {...},
free_func=<optimized out>) at ../../../../glib/glist.c:223
#14 0x00007ffff5c1fdaf in gst_bus_set_flushing (bus=<optimized out>,
flushing=<optimized out>) at gstbus.c:478
#15 0x00007ffff5c5f3e5 in gst_pipeline_change_state (element=0x5555576de090
[GstPipeline], transition=<optimized out>) at gstpipeline.c:549
#16 0x00007ffff5c38eee in gst_element_change_state
(element=element@entry=0x5555576de090 [GstPipeline],
transition=GST_STATE_CHANGE_READY_TO_NULL) at gstelement.c:2952
#17 0x00007ffff5c398ee in gst_element_continue_state
(element=element@entry=0x5555576de090 [GstPipeline],
ret=ret@entry=GST_STATE_CHANGE_SUCCESS) at gstelement.c:2660
#18 0x00007ffff5c390d5 in gst_element_change_state
(element=element@entry=0x5555576de090 [GstPipeline], transition=<optimized
out>) at gstelement.c:2991
#19 0x00007ffff5c398ee in gst_element_continue_state
(element=element@entry=0x5555576de090 [GstPipeline],
ret=ret@entry=GST_STATE_CHANGE_SUCCESS) at gstelement.c:2660
#20 0x00007ffff5c390d5 in gst_element_change_state
(element=element@entry=0x5555576de090 [GstPipeline],
transition=transition@entry=GST_STATE_CHANGE_PLAYING_TO_PAUSED) at
gstelement.c:2991
#21 0x00007ffff5c3960e in gst_element_set_state_func (element=0x5555576de090
[GstPipeline], state=GST_STATE_NULL) at gstelement.c:2906
#22 0x00005555558d3cd2 in GstEnginePipeline::~GstEnginePipeline()
(this=0x555557178d30, __in_chrg=<optimized out>) at
./src/engines/gstenginepipeline.cpp:506
#23 0x00005555558d3e09 in GstEnginePipeline::~GstEnginePipeline()
(this=0x555557178d30, __in_chrg=<optimized out>) at
./src/engines/gstenginepipeline.cpp:501
#24 0x00005555558c6792 in
std::_Sp_counted_base<(__gnu_cxx::_Lock_policy)2>::_M_release()
(this=0x5555573e0550) at /usr/include/c++/8/ext/atomicity.h:69
#25 0x00005555558c6792 in
std::__shared_count<(__gnu_cxx::_Lock_policy)2>::~__shared_count() (this=<optimized
out>, __in_chrg=<optimized out>) at /usr/include/c++/8/bits/shared_ptr_base.h:706
#26 0x00005555558c6792 in std::__shared_ptr<GstEnginePipeline,
(__gnu_cxx::_Lock_policy)2>::~__shared_ptr() (this=<optimized out>,
__in_chrg=<optimized out>) at /usr/include/c++/8/bits/shared_ptr_base.h:1145
#27 0x00005555558c6792 in std::__shared_ptr<GstEnginePipeline,
(__gnu_cxx::_Lock_policy)2>::reset() (this=0x55555680d778) at
/usr/include/c++/8/bits/shared_ptr_base.h:1263
#28 0x00005555558c6792 in GstEngine::EndOfStreamReached(int, bool) (this=0x55555680d6c0,
pipeline_id=<optimized out>, has_next_track=<optimized out>) at
./src/engines/gstengine.cpp:753
#29 0x0000555555ae8262 in GstEngine::qt_static_metacall(QObject*, QMetaObject::Call, int,
void**) (_o=0x55555680d6c0, _c=<optimized out>, _id=<optimized out>,
_a=0x7fff64003ec0) at ./obj-x86_64-linux-gnu/src/engines/moc_gstengine.cpp:211
#30 0x00007ffff721a072 in QObject::event(QEvent*) () at
/usr/lib/x86_64-linux-gnu/libQt5Core.so.5
#31 0x00007ffff4c864a1 in QApplicationPrivate::notify_helper(QObject*, QEvent*)
() at /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
#32 0x00007ffff4c8dae0 in QApplication::notify(QObject*, QEvent*) () at
/usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
#33 0x00007ffff71f0579 in QCoreApplication::notifyInternal2(QObject*, QEvent*)
() at /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
#34 0x00007ffff71f356b in QCoreApplicationPrivate::sendPostedEvents(QObject*,
int, QThreadData*) () at /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
#35 0x00007ffff7242c03 in () at /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
#36 0x00007ffff5dddc3e in g_main_dispatch (context=0x55555677a3e0) at
../../../../glib/gmain.c:3182
#37 0x00007ffff5dddc3e in g_main_context_dispatch
(context=context@entry=0x55555677a3e0) at ../../../../glib/gmain.c:3847
#38 0x00007ffff5ddded8 in g_main_context_iterate
(context=context@entry=0x55555677a3e0, block=block@entry=1,
dispatch=dispatch@entry=1, self=<optimized out>) at
../../../../glib/gmain.c:3920
#39 0x00007ffff5dddf6c in g_main_context_iteration (context=0x55555677a3e0,
may_block=1) at ../../../../glib/gmain.c:3981
#40 0x00007ffff7242223 in
QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) ()
at /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
#41 0x00007fffe56d1e51 in () at /usr/lib/x86_64-linux-gnu/libQt5XcbQpa.so.5
#42 0x00007ffff71ef24b in
QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () at
/usr/lib/x86_64-linux-gnu/libQt5Core.so.5
#43 0x00007ffff71f73c2 in QCoreApplication::exec() () at
/usr/lib/x86_64-linux-gnu/libQt5Core.so.5
#44 0x0000555555851d93 in main (argc=<optimized out>, argv=<optimized out>) at
./src/main.cpp:462
#45 0x00007ffff3e34b17 in __libc_start_main (main=0x555555851500 <main>, argc=1,
argv=0x7fffffffe608, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized
out>, stack_end=0x7fffffffe5f8) at ../csu/libc-start.c:310
#46 0x0000555555854e1a in _start () at ./src/main.cpp:478
Attached a file with some details on my debugging and the input file used,
maybe that has a special content.
Possibly you can track it down to a single file and provide the
output of mediainfo of that file.
Kind regards,
Bernhard